Java泛型通配符通过? extends T(上界)、? super T(下界)和?实现集合工具类最大兼容,严格遵循PECS原则:读取用上界(只获取、不可添加),写入用下界(可添加、读取仅限Object),无界通配符仅用于无关类型的操作。

Java 中泛型通配符在集合工具类中实现最大兼容,核心在于合理使用 ? extends T(上界)、? super T(下界)和无界通配符 ?,并严格遵循 PECS 原则(Producer Extends, Consumer Super)。
读取集合时用 ? extends T
当方法只从集合中**获取元素**(即作为数据生产者),应声明为 Collection extends T>。这样可接受 ArrayList<string></string>、LinkedList<object></object> 等所有 T 子类型的集合。
- 返回值类型安全:能安全赋值给
T或其父类型变量(如Number n = list.get(0);当list是List extends Number>) - 不能向其中添加(除
null外):编译器无法确定具体子类型,避免破坏类型安全 - 典型场景:工具方法如
max(Collection extends Comparable>> coll)
写入集合时用 ? super T
当方法主要向集合中**放入元素**(即作为数据消费者),应使用 Collection super T>。例如,把 Integer 写入 ArrayList<number></number> 或 Set<object></object> 都合法。
- 允许添加
T及其子类型实例(如往Collection super Number>中 addInteger、Double) - 读取时只能安全赋给
Object:因为下界不提供具体上层类型信息 - 典型场景:
Collections.copy(dest, src)中dest参数是Collection super T>
工具类方法签名设计示例
一个真正兼顾兼容性的集合工具方法,需按用途拆分通配符约束:
立即学习“Java免费学习笔记(深入)”;
-
查找/聚合类方法(只读):
public static <t extends comparable super t>> T max(Collection extends T> coll)</t> -
填充/转换类方法(只写或转换后写入):
public static <t> void fill(List super T> list, T element)</t> -
双向操作慎用无界通配符:如
swap(List> list, int i, int j)—— 仅用于不依赖元素类型的通用操作,无法读写具体类型
避免常见陷阱
通配符不是万能的,滥用反而降低类型安全性或可用性:
- 不要在类定义或字段上使用通配符(如
private List> data;),会丢失类型信息,后续操作受限 - 方法返回值尽量不用通配符(如
List extends String>),调用方难以处理;优先用具体类型参数化,如<e extends string> List<e></e></e> - 嵌套通配符(如
List<list extends number>></list>)易引发编译错误,必要时改用类型变量抽象


















