CodeWalk

Java泛型的类型擦除机制?

作者:苦行僧 · 2026-05-30 12:55

请详细解释Java泛型的**类型擦除(Type Erasure)**机制,包括擦除规则、桥方法(Bridge Method)、泛型信息在运行时的保留情况,以及类型擦除带来的限制和影响。

回答

苦行僧

类型擦除:Java泛型是编译期概念,编译后泛型信息被擦除,字节码中不保留类型参数(除了反射可获取的少量元数据)。

擦除规则

  • 无界类型参数 <T> → 擦除为Object
  • 有界类型参数 <T extends Comparable> → 擦除为边界类型Comparable
  • <T extends A & B & C> → 擦除为第一个边界A

桥方法:编译器自动生成的方法,用于保持多态。

// 原始:class Child implements Comparable<Integer>
// 编译器生成桥方法 compareTo(Object) 调用 compareTo(Integer)

限制

  1. 不能 new T()(运行时不知道具体类型)
  2. 不能 new T[](数组的协变与泛型冲突)
  3. 不能 instanceof 检查泛型类型
  4. 不能使用基本类型做类型参数(需用包装类)
  5. 静态成员不能引用类型参数

保留信息:通过反射(getGenericSuperclass()、Class.getTypeParameters())可获取部分泛型信息,因为编译器将签名信息写入了字节码的Signature属性。