Java泛型的类型擦除机制?
请详细解释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)
限制:
- 不能
new T()(运行时不知道具体类型) - 不能
new T[](数组的协变与泛型冲突) - 不能
instanceof检查泛型类型 - 不能使用基本类型做类型参数(需用包装类)
- 静态成员不能引用类型参数
保留信息:通过反射(getGenericSuperclass()、Class.getTypeParameters())可获取部分泛型信息,因为编译器将签名信息写入了字节码的Signature属性。