060_泛型擦除与边界限定
一、泛型擦除概述
1.1 定义与核心原理
泛型擦除是Java泛型实现的重要特性,指在编译阶段将泛型类型信息(类型参数)从字节码中移除的过程。Java的泛型是“编译期语法糖”,在运行时不保留泛型类型参数,所有泛型类型都会被转换为原始类型(Raw Type)。
核心原理:
- 编译时,编译器会检查泛型类型的使用是否合法(如类型匹配、边界约束)。
- 编译后,字节码中不再包含泛型类型参数,统一替换为其原始类型(无泛型的基础类型)。
- 运行时,虚拟机无法区分Container和Container,两者都被视为Container类型。
1.2 泛型擦除示例
1.2.1 泛型类的擦除
// 编译前:泛型类
public class Container<T> {private T data;public T getData() { return data; }public void setData(T data) { this.data = data; }
}// 编译后:泛型擦除为原始类型(T被替换为Object)
public class Container {private Object data;public Object getData() { return data; }public void setData(Object data) { this.data = data; }
}
1.2.2 带边界的泛型类擦除
// 编译前:带上限的泛型类
public class NumberContainer<T extends Number> {private T data;public T getData() { return data; }
}// 编译后:T被替换为上限类型Number
public class NumberContainer {private Number data;public Number getData() { return data;