泛型使集合在编译期明确元素类型,保障类型安全、免强制转换、提升性能与可读性;list、map等均为泛型类;支持类型推断、通配符(pecs原则)及自定义泛型容器。

泛型在集合类中的应用,核心是让集合“知道自己装的是什么类型”,从而在编译期就守住类型安全,避免运行时出错、减少强制转换、提升性能和可读性。
集合类定义时就带类型参数
Java 的 List<e></e>、Set<e></e>、Map<k></k> 等接口,以及 ArrayList<e></e>、HashSet<e></e>、HashMap<k></k> 等实现类,全部是泛型类。尖括号里的 E、K、V 就是类型参数,代表元素类型或键值类型。
比如:
-
List<string></string>表示只存字符串,往里加123会直接编译报错; -
Map<string integer></string>表示键必须是字符串、值必须是整数,put("age", "25")也会被编译器拦下。
遍历时无需手动强转
老式 ArrayList 存 Integer,取出来得 (Integer) list.get(0);而 List<integer></integer> 的 get() 方法返回类型就是 Integer,直接用,不拆箱也不强转。
迭代器也一样:Iterator<string></string> 的 next() 返回 String,不是 Object。
工具方法支持泛型推断Collections.sort(list) 要求 list 是 List<t></t> 且 T 实现 Comparable super T>,编译器能自动判断 List<localdate></localdate> 是否合法;Collections.max(list) 同理,类型约束清晰,错误提前暴露。
通配符增强灵活性
-
List extends Number>可接收List<integer></integer>或List<double></double>,适合只读场景(如求和); -
List super Integer>可接收List<number></number>或List<object></object>,适合只写场景(如批量添加整数);
这遵循 PECS 原则(Producer Extends, Consumer Super),让方法签名更准确、更安全。
自定义集合也依赖泛型
你自己写一个栈、队列或缓存容器,只要加 <t></t>,就能复用于任意类型:
class Stack<t> {
private List<t> data = new ArrayList();
void push(T item) { data.add(item); }
T pop() { return data.remove(data.size() - 1); }
}</t></t>
Stack<string></string> 和 Stack<user></user> 共享同一套逻辑,但各自类型隔离、互不影响。
不复杂但容易忽略











