跳到主要内容

泛型

泛型(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 非法);异常类不能参数化。