泛型核心在于理解类型安全、类型擦除和通配符规则:保障编译期类型检查,擦除导致无法new泛型对象等五类限制,通配符? extends/? super分别用于生产者与消费者场景。

泛型不是靠死记硬背的,关键在理解底层逻辑和常见陷阱。背题前先抓住三条主线:类型安全怎么保障、擦除机制带来哪些限制、通配符为什么必须分上界下界。
盯住“类型安全”这个出发点
所有泛型设计都围绕编译期检查展开。比如 List<String> 不能 add(123),不是运行时拦住,而是编译器直接报错。面试问“泛型作用”,答三点就够了:
- 提前暴露类型错误(避免 ClassCastException)
- 省掉手动强转(String s = (String) list.get(0) → String s = list.get(0))
- 一套代码适配多种类型(ArrayList、HashMap 全部复用同一套泛型框架)
把“类型擦除”当核心锚点来记
Java 泛型是编译期语法糖,运行时所有泛型信息都被擦掉——T 变成 Object,List<String> 和 List<Integer> 运行时都是 ArrayList。这个事实直接导致五类高频限制:
- 不能 new T() 或 new T[10](擦除后不知道具体类型)
- static 方法/变量不能用类泛型参数(静态属于类,而泛型属于实例)
- 不能用 instanceof 判断 List<String>(运行时只剩原始类型 List)
- 不能捕获或抛出 T 类型异常(异常处理需要运行时类型信息)
- 泛型数组创建失败(new String[10] 可以,new T[10] 编译不过)
通配符只记三句话口诀
通配符本质是解决泛型不协变问题(List<String> 不是 List<Object> 的子类),用法必须对应场景:
立即学习“Java免费学习笔记(深入)”;
- ? extends T:只读,适合“生产者”(如 Collections.max(List<? extends Number>))
- ? super T:只写,适合“消费者”(如 Collections.addAll(List<? super Integer>, ...)
- ?:完全未知,只能取 Object,不能 add 任何非 null 值(连 Object 都不行)
泛型类/方法/接口区分一句话
别被术语绕晕,看声明位置最准:
- 泛型类:class Box<T> —— T 在类名后,整个类内部通用
- 泛型方法:<E> void print(E e) —— <E> 在返回值前,只对该方法生效
- 泛型接口:interface Comparable<T> —— 实现类必须指定 T(如 class Dog implements Comparable<Dog>)


















