泛型
泛型(Generics)在编译期提供类型安全检查,避免强制类型转换,是 JDK 5 引入的核心特性。
泛型类、方法与接口
类名后声明类型参数,如 class Box<T>;方法可独立声明 <T>,与类的类型参数无关;接口同理,实现类需指定具体类型或保留参数化形式。
class Box<T> {
private T value;
public void set(T value) { this.value = value; }
public T get() { return value; }
}
通配符
? extends T 表示上界,只能读取为 T,不能写入(协变)。? super T 表示下界,只能写入 T 及其子类,读取只能得到 Object(逆变)。PECS 原则(Producer Extends, Consumer Super)指导集合参数设计。
类型擦除
泛型在编译后会被擦除,替换为上界类型(通常是 Object),字节码中不携带泛型信息。因此 List<String> 与 List<Integer> 在运行期是同一个类;不能创建泛型数组、不能 instanceof 检查具体类型参数。
桥接方法
为保持多态,编译器在子类重写父类泛型方法时生成桥接方法(bridge method),其签名是擦除后的类型,内部调用真实的子类方法。桥接方法是泛型与继承共存的必要细节。
泛型局限
基本类型不能作为类型参数,需用包装类;无法获取带参数的具体类型(T.class 非法);异常类不能参数化。