泛型核心在于编译期类型约束与容器行为匹配:一能编译时拦截非法添加(如List add(123)报错),二使取值免强转(String s = list.get(0));擦除机制致运行时无泛型信息,故不可创建泛型数组或实例;通配符?限制add操作;集合按Collection→List/Set/Map分层理解实现类差异。

泛型和集合是 Java 开发的基石,复习关键不在堆量,而在理清“类型约束”和“容器行为”的对应关系。抓准编译期检查、擦除机制、接口分层这三点,就能覆盖 90% 的高频考点和实际问题。
聚焦泛型的两个真实作用
别背定义,记住它解决的两个具体问题:
-
编译时就拦住错类型:比如
List中调用add(123),编译直接报错,而不是等运行时抛ClassCastException -
取值不用手动强转:写
String s = list.get(0)就行,编译器自动补上(String),代码干净又安全
只要每次声明集合都带上泛型(如 new ArrayList),这两个好处就自动生效。不写泛型(raw type)等于放弃保护,不推荐。
理解擦除机制,避开运行时陷阱
泛型只在编译期存在,字节码里全被擦成 Object。这意味着:
-
无法在运行时获取泛型实际类型:
list.getClass()拿不到String,只能看到ArrayList -
不能用泛型创建实例或数组:
new T[10]或new E()编译不过 -
通配符
?是只读的:List> list可以get()(返回Object),但不能add("x")(除了null),因为编译器不知道该存什么类型
按集合接口层级串联记忆
不用死记每个类,从根接口出发,一层层看差异:
-
Collection:单列集合总接口,有add、remove、size等通用方法 -
List:有序、可重复、支持索引 →ArrayList(查快、增删慢)、LinkedList(首尾增删快) -
Set:无序、不可重复 →HashSet(哈希表,快)、TreeSet(红黑树,自动排序) -
Map:双列键值对 →HashMap(非线程安全,最常用)、TreeMap(按键排序)
所有实现类都配合泛型使用,比如 Map 表示键是字符串、值是整数。
动手验证比看十遍更管用
打开 IDE,花 5 分钟写几行验证代码:
- 尝试往
List里加一个"abc",看编译报错提示 - 写
List extends Number>,试试能不能add(new Integer(1)),再试试get(0).doubleValue() - 对比
ArrayList和原始类型ArrayList在遍历时是否需要强转
错误和警告本身就在告诉你规则怎么起作用。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











