类型擦除概念
Java的泛型是伪泛型,在编译时进行类型检查,运行时不保留泛型信息(类型擦除)。
类型擦除过程
class Box {
private T value;
public T get() {
return value;
}
}
// 编译后变为:
class Box {
private Object value;
public Object get() {
return value;
}
}
泛型的限制
| 限制 | 说明 |
|---|---|
| 不能实例化T | new T()不允许 |
| 不能创建泛型数组 | new T[]不允许 |
| 不能使用基本类型 | T必须是引用类型 |
| 静态方法不能用类泛型 | 静态方法需单独声明泛型 |
类型擦除与桥方法
class Person implements Comparable {
private String name;
public int compareTo(Person other) {
return this.name.compareTo(other.name);
}
}
// 编译器自动生成桥方法:
public int compareTo(Object other) {
return compareTo((Person) other);
}
小结
- 泛型信息在编译时擦除,运行时不存在
- 类型擦除后T替换为Object或上限类型
- 编译器生成桥方法保持多态
- 泛型有类型安全性限制