博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java泛型的历史
阅读量:6192 次
发布时间:2019-06-21

本文共 979 字,大约阅读时间需要 3 分钟。

为什么Java泛型会有当前的缺陷?

  之前的章节里已经说明了Java泛型擦除会导致的问题,C++和C#的泛型都是在运行时存在的,难道Java天然不支持“真正的泛型”吗?

  事实上,在Java1.5在2004年10月发布泛型之前,Java就证明了它是可以实现运行时泛型的。早在2001年8月,有一门基于Java,能运行在JVM上的编程语言,就实现过运行时泛型,它叫做Pizza。不过很可惜,Pizza在一年后就消亡了,主要的开发人员转入了Generic Java(简称GJ)项目中,而GJ这门语言的泛型整合了通配符之后,就构成了如今Java泛型的原型。

  J2SE的开发者当然是明白Java泛型的问题的,在JVM LS 2015上,就有介绍几种泛型实现的比较:

  c++使用编译时模板填充来实现泛型,对于每一种参数类型,都会产生一份代码,优势是能很好的指定各种类型,劣势是没有代码复用,会占用大量的空间。

  C#则是把类型变量存入了二进制文件(以参数化二进制码的形式),这对于使用各种类型是有优势的,唯一存在的问题只是虚拟机的实现会复杂一些。

  Java的泛型实现则是依赖擦除,这对于代码复用有好处,但是对于原始数据类型支持不足。

  了解完泛型的历史,就不得不提一个人,Martin Odersky。此人是Pizza的作者,也是GJ的设计者之一,他在一次访谈中爆料:Java要支持泛型,遇到的最大的问题是向上兼容。

  按照JVM语言大会给出的说法,增加泛型功能无非两条路:

  1、修改虚拟机,使字节码本身支持泛型。

  2、把泛型信息抹去,用边界信息来代替。

  C#就选择了方案1并且取得了成功。但这会提高虚拟机实现的复杂度,同时,又会导致旧版本的字节码不能执行在新版本虚拟机上,当然,也有人问,为什么不能同时支持带泛型和不带泛型两种,这无疑是增加复杂度降低执行效率的。.NET从1.1跨度到2.0,就抛弃了之前的兼容性。

  可惜Java不能这么做,.NET在当时用户量并不多,实际应用的代码既不广泛也不大型。而Java已经迭代到了1.4版本,是最具活力的编程语言之一,庞大的用户量同时也桎梏了Java的选择。

  当然,Java开发者们也在不停的尝试新的方案,目前,新的Java泛型设计正在实行中,相信在新的J2SE版本能就能看到了。

转载地址:http://acgda.baihongyu.com/

你可能感兴趣的文章
WineQQ2012 最新下载 (转)
查看>>
python内置异常
查看>>
实测windows server 2008R2 域控迁移到 windows server 2012域控
查看>>
excel数据附件的使用方法及应用
查看>>
我的友情链接
查看>>
MindManager新手入门教程
查看>>
linux中yum命令详解
查看>>
ES权威指南[官方文档学习笔记]-61 Empty Search
查看>>
关于Java性能的9个谬论
查看>>
支付宝向他付款 代码生成器
查看>>
Sendmail在企业网中的应用
查看>>
java实现二维码的编码与解码
查看>>
装饰设计模式
查看>>
whois
查看>>
git 常用命令
查看>>
TCP/IP详解学习笔记(2)-数据链路层
查看>>
Linux下查看jdk版本切换
查看>>
吾日三省吾身1
查看>>
git 小记
查看>>
20150905-Linux上的任务计划
查看>>