1. Java泛型的类型擦除机制
先来看一个经典问题:ArrayList<String>和ArrayList<Integer>的类对象是否相同?通过下面代码可以验证:
List<String> strList = new ArrayList<>();
List<Integer> intList = new ArrayList<>();
System.out.println(strList.getClass() == intList.getClass()); // 输出true
这个结果揭示了Java泛型的核心特性——类型擦除(Type Erasure)。泛型信息只存在于编译阶段,运行时JVM看到的只有原始类型。这种设计是为了兼容Java 5之前的非泛型代码,使得泛型语法更像是"语法糖"。
1.1 无界类型擦除
当泛型参数没有边界限制时,编译器会将其替换为Object。例如:
public class Box<T> {
private T content;
public Box(T content) {
this.content = content;
}
}
编译后会变成:
public class Box {
private Object content;
public Box(Object content) {
this.content = content;
}
}
可以通过反射验证这一点:
Box<String> box = new Box<>("hello");
Field field = box.getClass().getDeclaredField("content");
System.out.println(field.getType()); // 输出java.lang.Object
1.2 有界类型擦除
当泛型参数有上界限制时,编译器会替换为上界类型:
public class NumberBox<T extends Number> {
private T number;
public double getDoubleValue() {
return number.doubleValue();
}
}


2285

被折叠的 条评论
为什么被折叠?



