? super T 表示下界通配符,用于消费者场景,允许向集合安全写入T及其子类对象,但读取时只能得到Object类型。

下限通配符的基本写法
语法很简单:List<? super Integer>。它表示这个列表可以是 List<Integer>、List<Number> 或 List<Object> 中的任意一种。
关键点在于:只要目标集合的元素类型是 Integer 的父类(含自身),就满足下界约束。
什么时候该用 ? super T
当你需要一个方法能安全地向不同层级的泛型集合中添加元素时,就该上 ? super T。
- 方法参数接收更宽泛的类型,比如既要支持
List<Number>,也要支持List<Object> - 你在做数据“归集”或“搬运”,例如把一堆
Integer添加进一个更通用的容器 - 遵循 PECS 原则中的 “Consumer Super” —— 集合是用来消费(接收)数据的
读和写的实际限制
下限通配符不是万能的,它有明确的读写边界:
立即学习“Java免费学习笔记(深入)”;
-
写入安全:可以调用
add(new Integer(42))、add(100),甚至add(new Long(1L))都不行 —— 注意!只能添加T及其子类,不能加父类。比如List<? super Integer>只能 addInteger或它的子类(但 Integer 没有公开子类,所以基本就是Integer) -
读取受限:取出的元素只能当作
Object使用,因为编译器不知道具体是Number还是Object,无法保证更具体的类型安全
一个典型例子:copy 方法
这是官方推荐的用法,体现下界的价值:
public static <T> void copy(List<? extends T> src, List<? super T> dest) {
for (T item : src) {
dest.add(item); // ✅ 安全:dest 能容纳 T 类型
}
}
这里 src 是生产者(只读),用 ? extends T;dest 是消费者(只写),用 ? super T。两者配合,既类型安全,又足够灵活。


















