使用 ? super t 表示集合作为消费者,允许安全写入 t 及其子类实例,但读取只能为 object;需在声明时体现下界约束,如 list

当集合用于接收并写入数据(即作为“消费者”)时,应使用 ? super T,这是 PECS 原则中 “Consumer Super” 的直接体现。它保证你能安全地往集合里添加 T 类型及其子类的实例,同时避免类型污染。
明确集合角色:它是用来存数据的
判断是否该用 super,关键看这个集合在方法中是否承担“接收、存储、消费”T 实例的责任。比如一个方法要把一堆 Integer 写进某个列表,那这个列表就是消费者。
- ✅ 正确场景:日志收集器接收
String;统计函数向List添加Number子类;通用工具类把元素塞进用户传入的集合 - ❌ 错误场景:从集合里取值做计算、返回具体子类型、需要强转为
T使用 —— 这时该用? extends T或具体类型
声明和参数类型要匹配 ? super T
不能只在调用时临时 cast,必须在方法签名或变量声明中体现下界约束。编译器靠这个推断写入安全性。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 定义方法时写:
public static void addNumbers(List super Number> target, Number... nums) - 调用时可传:
ArrayList<object></object>、LinkedList<serializable></serializable>、ArrayList<number></number>,甚至ArrayList<integer></integer>(因为Integer是Number的子类,但注意:ArrayList<integer></integer>实际上不满足? super Number—— 正确说法是:只有声明为能容纳Number或其父类的集合才合法,如ArrayList<object></object>或ArrayList<number></number>) - 反例:
List super Integer>可以接收Integer、int包装后的值,但不能接收Long(除非Long是Integer的子类,而它不是)—— 所以写入只能是Integer或其子类(实际没有,所以基本只写Integer)
写入安全,读取受限 —— 接受这个设计取舍
? super T 放宽了输入范围,但代价是读取能力下降。这是类型系统为安全做的平衡。
- ✅ 可以写:
list.add(new Integer(42))、list.add(null) - ❌ 不能直接读为
T:Integer i = list.get(0);编译失败;只能按Object接收:Object o = list.get(0); - ⚠️ 注意:不能写入
T的父类实例。例如List super Integer>允许 addInteger,但不允许 addNumber或Object—— 因为实际运行时集合可能是ArrayList<integer></integer>,加Number会破坏类型一致性
典型实用写法示例
一个通用的“批量添加”工具方法:
public static <t> void putAll(List super T> dest, Iterable<t> src) {
for (T item : src) {
dest.add(item); // 安全写入
}
}</t></t>
调用时:
-
putAll(new ArrayList<object>(), Arrays.asList("a", "b"));</object>✅ -
putAll(new ArrayList<charsequence>(), Arrays.asList("x", "y"));</charsequence>✅(String是CharSequence子类) -
putAll(new ArrayList<string>(), Arrays.asList("p", "q")); </string>❌ 编译失败 ——ArrayList<string></string>不满足? super String(因为String的父类是Object、CharSequence等,ArrayList<string></string>只能存String,不能存更宽泛的类型)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










