泛型的核心在于理解类型安全、编译机制与集合设计意图,而非死记硬背;需掌握“为什么用”(避免classcastexception、提前报错)、“怎么用”(类/方法/接口三类)和“有什么限制”(类型擦除、基本类型不可用等)三大主干,并深入理解extends/super的pecs原则及擦除机制本质。

泛型不是靠死记硬背的,关键在理解逻辑和建立结构感。面试官问“泛型”,其实是在考察你对类型安全、编译机制、集合设计意图的把握程度。下面几个方向抓准了,思维导图自然就立得住,面试也能讲得清楚。
先理清三条主干:为什么用、怎么用、有什么限制
这是所有泛型问题的底层骨架,几乎所有面试题都从这里延伸:
- 为什么用:避免运行时 ClassCastException;省去显式强转(比如 list.get(0) 不用再 (String));让错误提前到编译期发现
-
怎么用:分三类——泛型类(
Box<t></t>)、泛型方法(<t> void print(T[])</t>)、泛型接口(Comparable<t></t>) -
有什么限制:类型擦除(运行时无泛型信息,
List<string>.class == List<integer>.class</integer></string>);不能用基本类型(要写Integer,不能写int);不能 new T()、不能 instanceof T
重点吃透 extends 和 super —— 面试必问
这两个关键字决定通配符的读写能力,本质是 PECS 原则(Producer Extends, Consumer Super):
-
List extends Number>:只能读,不能 add(除了 null),因为具体子类型不确定(可能是 Integer,也可能是 Double) -
List super Integer>:可以 add Integer 及其子类,但读出来只能当 Object 用(因为上界可能是 Number 或 Object) - 记法:extends 向上找父类 → 安全输出;super 向下找子类 → 安全输入
结合集合框架来记,别孤立背语法
泛型在 JDK 集合中是强制落地的,脱离场景背等于白背:
-
ArrayList<string> list = new ArrayList();</string>—— 编译器帮你检查 add 的是不是 String,get 返回值自动是 String 类型 - 对比 JDK 1.4 时代:没有泛型的
ArrayList,add 什么都能进,取出来全要手动强转,容易出错 - ConcurrentHashMap、LinkedHashSet 等所有标准集合实现,泛型参数都参与了内部逻辑(比如哈希计算、equals 判断),不是摆设
擦除机制要能举例说明
这是区分“背过”和“真懂”的分水岭:
- 写两行代码:
new ArrayList<string>().getClass() == new ArrayList<integer>().getClass()</integer></string>结果是 true - 原因:编译后都变成
ArrayList,泛型信息被擦掉,只保留桥接方法和类型检查字节码 - 所以反射拿不到泛型实际类型(除非通过字段/方法签名 + TypeToken 等手段间接获取)
不复杂但容易忽略:泛型是编译器给你的“防护网”,不是运行时的“类型系统”。把这句话想透,大部分题就通了。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











