java泛型下限通配符? super t专为安全写入设计,允许向list

Java 泛型通配符下限(? super T)专为“写入”场景设计,核心是让方法能安全接收更宽泛的集合类型,同时保证向其中添加 T 或其子类对象不会破坏类型安全。
下限通配符的写入能力边界
声明为 List super Integer> 的列表,实际类型可能是:
• List<integer></integer>
• List<number></number>
• List<object></object>
编译器只知道“至少是 Integer 的父类”,因此只允许写入 Integer 及其子类(如 Long、Short 等,前提是它们是 Integer 的子类——注意:实际上 Long 与 Integer 是同级子类,不满足;真正可写的是 Integer 自身及其直接/间接子类,比如自定义的 MyInt extends Integer)。
关键点:
• ✅ 可以 add(new Integer(42))
• ✅ 可以 add(100)(自动装箱为 Integer)
• ❌ 不可 add(new Number())(Number 不是 Integer 的子类,且 Number 实例不能向上转型为所有可能的实际类型,如 Object 列表虽能存,但 Number 不一定兼容 Integer 列表)
• ❌ 不可 add(new Object())(同理,Object 太宽泛,不满足“是 Integer 子类”的约束)
典型写入使用场景:通用添加方法
当你想写一个能往多种类型列表中添加 Integer 的工具方法时,用 ? super Integer 是标准解法:
public static void addIntegers(List super Integer> list, int... values) {<br> for (int v : values) {<br> list.add(v); // 安全:v 自动装箱为 Integer,符合 ? super Integer 约束<br> }<br>}
调用示例:
• List<integer> intList = new ArrayList(); addIntegers(intList, 1, 2, 3);</integer>
• List<number> numList = new ArrayList(); addIntegers(numList, 10, 20);</number>
• List<object> objList = new ArrayList(); addIntegers(objList, 100);</object>
全部合法 —— 方法无需重载,也不依赖具体类型。
配合 PECS 原则做数据转移
下限通配符最经典的实战是与上界通配符搭配,实现类型安全的集合复制:
public static <t> void copy(List extends T> src, List super T> dest) {<br> for (T item : src) {<br> dest.add(item); // ✅ item 是 T 类型,dest 允许接收 T 或其父类<br> }<br>}</t>
例如:
• copy(new ArrayList<integer>(), new ArrayList<number>());</number></integer>
• copy(new ArrayList<string>(), new ArrayList<charsequence>());</charsequence></string>
这里 src 是生产者(只读),用 ? extends T;dest 是消费者(只写),用 ? super T。两者协同,既灵活又安全。
写入时的常见误区提醒
• 误以为可以写入任意父类:不能向 List super Integer> 写 new Number(),因为实际类型可能是 List<integer></integer>,而 Number 无法赋值给 Integer。
• 忽略读取限制:写入没问题,但之后 get(0) 返回的是 Object,不能直接当 Integer 用,需手动强转(不推荐)或换用明确类型。
• 混淆 super 和 extends:写操作必须用 super,用 extends 会导致编译失败(add 被禁止)。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











