Java 面试题
目录

解释 Java 中的类型擦除。

· 约 3 分钟读完 · 第 13 / 274 章

推荐答案

本题详细解读

什么是类型擦除?

类型擦除(Type Erasure)是 Java 泛型实现的一种机制。在编译期间,Java 编译器会将泛型类型参数替换为它们的边界类型(通常是 Object),并在必要时插入类型转换代码。这样做的目的是为了保持与 Java 5 之前版本的兼容性,同时提供泛型编程的能力。

类型擦除的工作原理

  1. 编译时类型检查:在编译时,Java 编译器会检查泛型类型的使用是否正确。例如,如果你尝试将一个 Integer 对象添加到 List<String> 中,编译器会报错。

  2. 类型擦除:在编译后,所有的泛型类型信息都会被擦除。例如,List<String> 和 List<Integer> 在运行时都会被当作 List<Object> 来处理。

  3. 类型转换:在需要时,编译器会自动插入类型转换代码。例如,当你从 List<String> 中获取元素时,编译器会自动将 Object 类型转换为 String 类型。

类型擦除的影响

  1. 运行时类型信息丢失:由于类型擦除,泛型类型参数在运行时是不可用的。例如,你不能在运行时判断一个 List 是 List<String> 还是 List<Integer>。

  2. 泛型数组的创建受限:由于类型擦除,Java 不允许直接创建泛型数组。例如,new List<String>[10] 是不合法的。

  3. 方法重载的限制:由于类型擦除,你不能定义两个方法,它们的参数类型仅仅是泛型类型参数不同。例如,void method(List<String> list) 和 void method(List<Integer> list) 会导致编译错误。

示例代码解析

在示例代码中,stringList 和 integerList 分别是 List<String> 和 List<Integer> 类型的实例。尽管它们的泛型类型参数不同,但在运行时,它们的类型都被擦除为 List。因此,stringList.getClass() == integerList.getClass() 返回 true,表明它们在运行时具有相同的类型。

这个输出结果验证了类型擦除的存在,即在运行时,泛型类型信息已经被擦除,List<String> 和 List<Integer> 都被当作 List 类型来处理。