学Java泛型面试题关键在于理清三条线:为什么需要泛型、它怎么工作、哪些地方容易出错;核心作用是编译期类型安全、免强制类型转换、提升复用性;擦除机制导致运行时无泛型信息;需分清泛型类、泛型方法与通配符场景;高频坑点须动手验证。

学Java泛型面试题,关键不是背答案,而是理清三条线:为什么需要泛型、它怎么工作、哪些地方容易出错。
抓住泛型的三个核心作用
面试官常问“泛型有什么用”,标准回答要落在三点上:
- 编译期类型安全:List<String> 里加个 Integer,编译直接报错,避免运行时 ClassCastException;
- 免强制类型转换:不用再写 (String) list.get(0),取出来就是 String;
- 提升复用性:一个泛型类(比如 MyArrayList<T>)能服务 String、Integer、User 等所有类型,不用为每种类型写一套。
理解擦除机制是解题钥匙
所有泛型相关陷阱都源于「编译期检查 + 运行时擦除」。记住几个典型表现:
- new ArrayList<String>() 和 new ArrayList<Integer>() 在运行时是同一个 Class(ArrayList.class);
- 无法通过 instanceof 判断泛型类型,比如 if (list instanceof ArrayList<String>) 编译不通过;
- 静态方法/静态变量不能使用类的泛型参数 T,因为静态内容属于类本身,而 T 是实例化时才确定的。
分清泛型类、泛型方法、通配符的适用场景
别混淆三者用途:
立即学习“Java免费学习笔记(深入)”;
- 泛型类(如 class Box<T>):定义模板结构,整个类逻辑围绕 T 展开;
- 泛型方法(如 <E> void print(E e)):方法自身独立声明类型参数,和类是否泛型无关;
- 通配符 ?:用于参数接收不确定类型,比如 List<? extends Number> 可接收 List<Integer> 或 List<Double>,但不能 add 任意元素(除了 null)。
高频坑点必须动手验证
光看结论容易忘,建议敲几行代码确认:
- 试试 new T[10] —— 编译失败,得写 (T[]) new Object[10];
- 写个 static <T> T getFirst(List<T> list),再调用 getFirst(new ArrayList<String>()),观察 T 如何推断;
- 把 ArrayList<String> 强转成 ArrayList,再往里 add(123),运行看是否报错(不会报,但取值时崩)。


















