黑马程序员技术交流社区

标题: 关于泛型擦除的一个小疑惑 [打印本页]

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

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






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2