? super T 表示泛型类型为 T 或其任意父类,用于安全写入 T 类型对象;可向 List<? super Integer> 添加 Integer,但 get() 仅返回 Object,因具体类型不确定,体现 PECS 中“Consumer Super”原则。

Java 中用 ? super T 限制泛型下界,表示该泛型类型必须是 T 或 T 的任意父类。它主要用于“写入”场景,确保能安全地向集合中添加 T 类型的对象。
下界通配符的基本写法
语法为 List<? super T>,其中 T 是你指定的基准类型。例如:
-
List<? super Integer>可以引用List<Integer>、List<Number>或List<Object> -
Collection<? super String>能接收ArrayList<String>、LinkedList<Object>等
为什么只能写入 T,不能安全读取?
因为编译器只知道元素类型至少是 T 的父类,但不确定具体是什么——可能是 Object、Serializable、CharSequence 等。所以:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 可以调用
add(T):传入Integer到List<? super Integer>总是安全的 - 但
get(0)只能赋给Object类型变量,无法直接转成Integer(编译报错)
典型应用场景:消费者操作
符合 PECS 原则中的 “Consumer Super”,常见于工具方法:
立即学习“Java免费学习笔记(深入)”;
- 通用复制方法:
void copy(List<? extends T> src, List<? super T> dest) - 批量添加:
void addAll(List<? super String> target, String... items) - JDK 中的
Collections.<T>addAll(Collection<? super T>, T...)就是这样设计的
和 extends 的关键区别
对比记忆更牢:
-
? extends T:可读不可写(除null),适合“生产者” -
? super T:可写不可精确读,适合“消费者” - 两者都不能直接 new,比如
new ArrayList<? super String>()是非法的

















