泛型擦除
泛型是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。
Java的泛型基本上都是在编译器这个层次上实现的,在生成的字节码中是不包含泛型中的类型信息的,使用泛型的时候加上类型参数,在编译器编译的时候会去掉,这个过程成为类型擦除。看下面代码
public class Main{
public static void main(String[] args) {
ArrayList<Integer> arrayList1 = new ArrayList<>();
ArrayList<String> arrayList2 = new ArrayList<>();
System.out.println(arrayList1.getClass() == arrayList2.getClass());
}
}
输出结果
true
可以看到ArrayList
public class Main{
public static void main(String[] args) throws Exception {
ArrayList<Integer> arrayList = new ArrayList<>();
arrayList.add(1);
arrayList.getClass().getMethod("add", Object.class).invoke(arrayList, "a");
System.out.println(arrayList.get(0));
System.out.println(arrayList.get(1));
}
}
输出
1
a
可以看到通过反射进行add操作,ArrayList
既然存在类型擦除,那么Java是如何保证在ArrayList
Java编译器是通过先检查代码中泛型的类型,然后在进行类型擦除,再进行编译。

浙公网安备 33010602011771号