java泛型是编译期类型检查机制,运行时类型信息被擦除:list和list字节码中均为list;类型参数擦除为上界或object;导致无法instanceof判断、不能创建泛型数组、静态成员不可用类型参数。

Java 泛型不是语法糖,是编译期的类型检查机制,运行时会被擦除(Type Erasure),这是理解所有泛型问题的核心。
泛型擦除到底擦掉什么
编译后,泛型信息全部消失:List
- 不能用 instanceof 判断泛型类型,比如 if (list instanceof ArrayList
) 编译不通过 - 不能创建泛型数组,new ArrayList
[10] 会报错,因为运行时无法保证类型安全 - 静态方法/字段不能直接使用类的类型参数(如 static T value; 是非法的)
通配符 ? 和边界怎么选
问“什么时候用 ? extends T,什么时候用 ? super T”?记住 PECS 原则(Producer Extends, Consumer Super):
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 只往外取数据(读)→ 用 ? extends T(如 List extends Number> 可以 get() 出 Number 或其子类,但不能 add() 任何具体对象)
- 只往里放数据(写)→ 用 ? super T(如 List super Integer> 可以 add(Integer),但 get() 只能拿到 Object)
- 既读又写 → 就别用通配符,直接用具体类型,比如 List
泛型方法和类型推断常见陷阱
泛型方法声明在返回值前加
- 类型推断依赖实参,不是返回值。下面代码会报错:String s = Utils.parse(); 因为没传参,编译器无法推断 T
- 若实参是 null,推断可能失败或退化为 Object,建议显式指定:Utils.
parse() - 泛型方法可重载,但仅靠返回类型不同不行(如
T get() 和 List get() 不能共存)
为什么泛型不能继承,但可以实现?
泛型类本身不是类型,而是模板。ArrayList
- List
list = new ArrayList (); ✅ —— 因为 ArrayList 实现了 List 接口 - List
list = new LinkedList (); ✅ —— 同样是接口实现关系 - ArrayList
list = new ArrayList
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










