写点什么

解密 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:034981
用户头像
臧秀涛 略懂技术的运营同学。

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

关注

评论

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

OSCS开源安全周报第22期:NuGet 仓库中被发现 13.5 万个包含钓鱼地址的组件包

墨菲安全

GitHub标星已达26K+,鹅厂技术总监手写分布式架构体系笔记

小小怪下士

Java 程序员 分布式

Python 的安装与配置(图文教程)

千锋IT教育

火山引擎DataTester科普:A/B实验常见名词解释

字节跳动数据平台

大数据 AB testing实战 12 月 PK 榜

西藏等保测评公司有哪些?共有几家?

行云管家

等保测评 等保测评公司 西藏

TDengine与中泰证券正式签约,打造金融量化交易场景解决方案

TDengine

数据库 tdengine 时序数据库

怎样徒手写一个React

helloworld1024fd

JavaScript

HIFIVE音加加提供曲库、评分、修音功能的K歌SDK-Android版本

数到3变暖男i

API 社交泛娱乐 娱乐社交 K歌 K歌SDK

行业认可|墨菲安全登信息通信软件供应链安全社区优秀榜单

墨菲安全

MegEngine Windows Python wheel 包减肥之路

MegEngineBot

深度学习 开源 MegEngine

一文读懂于Zebec生态中的潜在收益方式

鳄鱼视界

大数据开发技术培训班怎么选

小谷哥

皮皮App发起爱心捐赠,让城市里的荧荧之光,给乡村孩子带去一片暖冬

联营汇聚

参加java培训对学习程序员有用吗?

小谷哥

Vue-Router 路由与配置

千锋IT教育

一文带你了解EiPaaS和EiPaaS的国际趋势

华为云开发者联盟

云计算 后端 华为云 12 月 PK 榜

阿里二面被问MySQL的事务隔离级别,结果回去等通知了

程序员小毕

MySQL 数据库 程序员 面试 后端

学习大数据培训和自学哪个比较好

小谷哥

基于 Caddy 部署盘古 Admin 实现流量网关

码农大熊

盘古开发框架

如何通过 NFTScan 发掘 NFT 项目的内在价值

NFT Research

区块链 NFT

如何用 7 分钟玩转函数计算?

阿里巴巴云原生

阿里云 Serverless 云原生

“2022混合云TOP50”重磅发布 天翼云问鼎榜首

极客天地

【电路设计】避开元器件的这些“坑”,多年的心梗都治好了!

华秋PCB

工具 PCB PCB设计

校招前端二面常考手写面试题汇总

helloworld1024fd

JavaScript

为什么是无代码?

间隔

微信小程序 编辑器 无代码

如何在小程序中完成支付进件

Towify

微信小程序 编辑器 无代码

前端程序员培训学习需要学多久?

小谷哥

手写JS函数的call、apply、bind

helloworld1024fd

JavaScript

只要是做乙方,欧美白人下班后也别想失联?

SAP虾客

IT行业 乙方 工作与生活分开 欧美 TICKET

部分双机热备软件详细介绍-行云管家

行云管家

高可用 双机热备 双机

前端编程学习有没有必要参加?

小谷哥

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