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

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


















