回答重点
泛型擦除指的是Java编译器在编译时将所有泛型信息删除的过程,以确保与Java1.4及之前的版本保持兼容
泛型参数在运行时会被替换为其上界(通常是Object),这样一来在运行时无法获取泛型的实际类型。
作用:泛型擦除确保了Java代码的向下兼容性,即可以与旧版本的Java代码兼容,为了让使用泛型的代码在不同版本的Java运行时环境中都可以正常工作。又由于泛型类型信息在编译时期被擦除了,因此运行时无法获取泛型信息,这样就不能创建泛型类型的数组或对泛型类型使用instanceof检查
示例:
public <T> void printList(List<T> list) {
for (T element : list) {
System.out.println(element);
}
}
编译后的代码类似于:
public void printList(List list) {
for (Object element : list) {
System.out.println(element);
}
}
类型T会被擦除成Object
扩展知识
为什么Java泛型的实现是类型擦除?
回答重点提到了主要原因是为了向下兼容,即兼容Java5之前编译的class文件。
例如Java1.2上正在跑的代码,可以在Java1.5上的JRE上运行
也是因为需要向下兼容