NVIDIA 初创加速计划,免费加速您的创业启动 了解详情
写点什么

解密 Java 增强的泛型

  • 2015-01-06
  • 本文字数:1082 字

    阅读完需:约 4 分钟

尽管 Java 8 是 2014 年年初才发布的,而 Java 9 要等到 2016 年年中,但是目前有一些计划放到某个未来版本(希望是 Java 10)中的特性已经合并了进来。

具体而言,有两个比较大的特性已经开始原型设计了,它们是增强的泛型(Enhanced Generics)和值类型(Value Types)。有了增强的泛型,Java 开发者可以编写像 List这样的代码,省去了对基本类型进行装箱的痛苦。新的泛型提案有些地方比较模糊(或者说微妙),需要细心处理,具体见 Brian Goetz 在最近的设计文章中的解释。

Java 一直在关注向后兼容,在 Oracle 的管理下,这一点也得到再次确认。为此,Oracle 在寻求一种与 Java 5 中引入的泛型类似的策略,渐进地迁移。

需要克服的基本设计问题是,Java 的类型系统没有一个统一的根。Java 中没有这样的类型,既是 Object 的子类,又是 int 的子类。从 JVM 字节码的结构也可以看出,很明显从方法返回一个 int 和返回一个对象用的是不同的操作码(opcode)——ireturn 和 areturn 是不一样的。

目前的原型使用了一种叫做“any”类型变量的方式,用以指示既可以是引用类型,又可以是基本类型的类型变量(还包括新提议的值类型)。目前写作 Container,但是在该特性真正交付之前,语法还会改变。

目前的想法是,List和List在运行时将继续使用List.class 表示(因此对于引用类型,将继续存在类型擦除),List则会用与之不同的运行时类型表示(可能会用不同的class 文件)。这种方式被称作基本类型的“泛型特化”。此举还可以给另一个设计问题带来帮助,那就是升级现有的集合类,使用增强的泛型。支持开发者使用List是一个主要的设计目标,从现有的泛型类型,到未来版本中支持任何类型变量的泛型类型,应该可以迁移过去。

关于增强的泛型如何适应类型系统,还有些令人感觉奇怪的地方。比如,List不是List 类型的子类型(如果是的话,这就意味着List可以存储Object 的实例)。然而, List是List 的子类型,所以这意味着List不是List的子类型,通配符就无法应用于增强的泛型。

目前的原型离真正产品化还差得远,还有很多设计和实现工作要做。特化的实现正在积极进行。自动生成特化代码更为可取(减少手工编写样板代码),但这可能需要在字节码和类加载子系统中提供额外的支持。还有一个非常有趣的可能性,就是在虚拟机层面引入一个元编程设施(不是Java 语言层面的直接支持)。用invokedynamic 类比,这种方式可以称为“classdynamic”,可以参见这里的描述。

增强的泛型和值类型的开发都是通过 Project Valhalla 管理的,更多细节可以参见该项目。

查看英文原文: Under The Hood With A Prototype of Enhanced Generics for Java

2015-01-06 02:034349
用户头像
臧秀涛 略懂技术的运营同学。

发布了 300 篇内容, 共 130.2 次阅读, 收获喜欢 34 次。

关注

评论

发布
暂无评论
发现更多内容

2021年金三银四必问的1000道Java面试题及答案整理

爱好编程进阶

Java 程序员 后端开发

2022年编程语言排名,官方数据来了,让人大开眼界

爱好编程进阶

Java 程序员 后端开发

7-32 哥尼斯堡的“七桥问题” (25 分)(思路

爱好编程进阶

Java 程序员 后端开发

C++最佳实践 | 1. 工具

俞凡

c++ 最佳实践

java内存模型之重排序

急需上岸的小谢

5月月更

5 年 Java 开发经验,阿里面试了 7 轮,太难了呀

爱好编程进阶

Java 程序员 后端开发

11月数据库排行:PostgreSQL起飞、三巨头分数持续低迷

爱好编程进阶

程序员 后端开发

14-Docker 镜像安装实践

爱好编程进阶

Java 程序员 后端开发

6月GitHub上最牛逼的10个Java开源项目,号称“Star收割机

爱好编程进阶

Java 程序员 后端开发

《对线面试官》 JavaNIO

Java3y

Java 开源 编程语言 语言 & 开发 5月月更

2021年最新版阿里、腾讯、美团300道Java初级

爱好编程进阶

程序员 后端开发

985硕非科班,靠着自己的努力一步一步转行拿到抖音后端offer,现在想想就觉得满足

爱好编程进阶

Java 程序员 后端开发

Day168

爱好编程进阶

Java 程序员 后端开发

TypeScript 里的 Reference Type 和 Triple-Slash Directives

Jerry Wang

typescript 编程语言 angular 5月月更 directive

01-初识Git

爱好编程进阶

Java 程序员 后端开发

2020年春招复盘:技术三面+HR面

爱好编程进阶

Java 程序员 后端开发

Day193

爱好编程进阶

Java 程序员 后端开发

k8s client-go源码分析 informer源码分析(2)-初始化与启动分析

良凯尔

容器 云原生 #Kubernetes# Client-go

# Java基础复习(DayEight

爱好编程进阶

程序员 后端开发

Intellij官方中文语言包,它来了

FunTester

32岁的我裸辞了,八年 Java 老鸟,只因薪水被应届生倒挂

爱好编程进阶

Java 程序员 后端开发

ansible2

爱好编程进阶

Java 程序员 后端开发

CCF201509-2 日期计算

爱好编程进阶

Java 程序员 后端开发

CGBTN2108-DAY07总结复习

爱好编程进阶

Java 程序员 后端开发

Day262

爱好编程进阶

Java 程序员 后端开发

【刷题第2天】买卖股票的最佳时机

白日梦

5月月更

以购物车为例探讨 Flutter 的状态管理的必要性

岛上码农

flutter ios开发 安卓开发 跨平台应用 5月月更

16个 Redis 常见使用场景,面试有内容聊啦

爱好编程进阶

Java 程序员 后端开发

前端食堂技术周刊第 36 期:pnpm v7.0.0、Node 对 ESM 的支持达到重要里程碑、四月份登陆浏览器的新功能、VS Code April 2022

童欧巴

JavaScript 前端 Node React 前端工程师

Bean的作用域与Bean的生命周期详解

爱好编程进阶

Java 程序员 后端开发

CQRS架构

爱好编程进阶

Java 程序员 后端开发

解密Java增强的泛型_Java_Ben Evans_InfoQ精选文章