JAVA 泛型之类型擦除

时间:2022-02-16 23:32:45

★ 泛型是 JDK 1.5 版本引进的概念,之前是没有泛型的概念的,但泛型代码能够很好地和之前版本的代码很好地兼容。

CollectionTest.java ---编译成CollectionTest.class ----JVM中运行

因为泛型信息只存在于代码编译阶段,编译器编译完带有泛形的java程序后,生成的class文件中与泛型相关的信息会被擦除掉,以此使程序运行效率不受到影响,这个过程叫做类型擦除,也就是说泛型类和普通类在 java 虚拟机内是一样的。

List<String> strLis = new ArrayList<String>();

List<Integer> intLis = new ArrayList<Integer>();

System.out.println(strLis.getClass() == intLis.getClass());//true

泛型类List<String>和List<Integer>经过编译被类型擦除后类型均为java.util.ArrayList

思考:由于编译生成的字节码会丢掉泛型的类型信息,只要能跳过编译器,就可以往某个泛型集合中加入其它类型的数据(反射中的知识点)。

在JDK 1.5中, 你还可以按原来的方式将各种不同类型的数据装到一个集合中,但编译器会报告unchecked警告。