推荐答案
// www.javascriptcn.com code example
import java.util.ArrayList;
import java.util.List;
public class TypeErasureExample {
public static void main(String[] args) {
List<String> stringList = new ArrayList<>();
List<Integer> integerList = new ArrayList<>();
System.out.println(stringList.getClass() == integerList.getClass()); // 输出 true
}
}本题详细解读
什么是类型擦除?
类型擦除(Type Erasure)是 Java 泛型实现的一种机制。在编译期间,Java 编译器会将泛型类型参数替换为它们的边界类型(通常是 Object),并在必要时插入类型转换代码。这样做的目的是为了保持与 Java 5 之前版本的兼容性,同时提供泛型编程的能力。
类型擦除的工作原理
编译时类型检查:在编译时,Java 编译器会检查泛型类型的使用是否正确。例如,如果你尝试将一个
Integer对象添加到List<String>中,编译器会报错。类型擦除:在编译后,所有的泛型类型信息都会被擦除。例如,
List<String>和List<Integer>在运行时都会被当作List<Object>来处理。类型转换:在需要时,编译器会自动插入类型转换代码。例如,当你从
List<String>中获取元素时,编译器会自动将Object类型转换为String类型。
类型擦除的影响
运行时类型信息丢失:由于类型擦除,泛型类型参数在运行时是不可用的。例如,你不能在运行时判断一个
List是List<String>还是List<Integer>。泛型数组的创建受限:由于类型擦除,Java 不允许直接创建泛型数组。例如,
new List<String>[10]是不合法的。方法重载的限制:由于类型擦除,你不能定义两个方法,它们的参数类型仅仅是泛型类型参数不同。例如,
void method(List<String> list)和void method(List<Integer> list)会导致编译错误。
示例代码解析
在示例代码中,stringList 和 integerList 分别是 List<String> 和 List<Integer> 类型的实例。尽管它们的泛型类型参数不同,但在运行时,它们的类型都被擦除为 List。因此,stringList.getClass() == integerList.getClass() 返回 true,表明它们在运行时具有相同的类型。
System.out.println(stringList.getClass() == integerList.getClass()); // 输出 true
这个输出结果验证了类型擦除的存在,即在运行时,泛型类型信息已经被擦除,List<String> 和 List<Integer> 都被当作 List 类型来处理。