A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 三十而立 中级黑马   /  2014-2-6 09:47  /  1319 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

Java中的泛型类型(或者泛型)类似于 C++ 中的模板。但是这种相似性仅限于表面,Java 语言中的泛型基本上完全是在编译器中实现,用于编译器执行类型检查和类型推断,然后生成普通的非泛型的字节码,这种实现技术称为擦除(erasure)(编译器使用泛型类型信息保证类型安全,然后在生成字节码之前将其清除)。这是因为扩展虚拟机指令集来支持泛型被认为是无法接受的,这会为 Java 厂商升级其 JVM 造成难以逾越的障碍。所以,java的泛型采用了可以完全在编译器中实现的擦除方法。
问题:红色标示的话该如何理解?

评分

参与人数 1技术分 +1 收起 理由
黄晓东 + 1

查看全部评分

1 个回复

倒序浏览
本帖最后由 段光宇 于 2014-2-7 15:07 编辑

举个例子吧,例如有一个Arraylist集合,你对它限制一个整数型泛型,就只能向其添加整数型的值,因为编译器在编译时会检查,这是都知道的
可是Arraylist集合中的元素本来是支持存入很多类型的,如果编译器不对泛型进行擦除的话,虚拟机内部就一定要增加方法去判断这个字节码文件中的Arraylist集合上的泛型,非常麻烦,升级虚拟机时还要考虑这个方法要不要升级,要不要重写,而且虚拟机的发展方向都是小型化的。
所以目前编译器对泛型进行擦除是必要的减小虚拟机的压力,将类型判断这个事情交给编译器自身做就可以了。

评分

参与人数 1技术分 +1 收起 理由
黄晓东 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马