Java中super关键字用于泛型下限边界,语法为? super T,表示通配符类型必须是T或其父类;核心用途是“写入安全”,如List<? super Integer>可接受List<Integer>、List<Number>、List<Object>,支持add(Integer)操作,遵循PECS原则(Consumer Super)。

Java 中用 super 关键字限制泛型类型的下限边界,意思是:通配符所代表的类型必须是某个指定类,或它的任意父类(包括 Object)。
下限边界的基本写法
语法形式为 ? super T,其中 T 是你指定的“下限类型”。它不表示“T 的子类”,而是“T 本身或其所有父类”。
-
List<? super Integer>可以接受List<Integer>、List<Number>、List<Object> - 但不能接受
List<Long>或List<String>—— 它们和 Integer 没有父子关系
为什么需要下限?核心用途是“写入安全”
当你需要往集合中添加元素,又希望方法能兼容更宽泛的类型时,下限就派上用场了。因为只有知道目标类型至少是 T 或更高(即父类),才能保证 add(T) 操作是类型安全的。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 例如:
void addNumbers(List<? super Integer> list)中,你可以放心调用list.add(new Integer(42)) - 如果传入的是
List<Number>,Integer 是 Number 的子类,add 合法;如果是List<Object>,Integer 当然也能放进 Object 容器 - 但如果用
? extends Integer,你就不能 add 任何东西(除了 null),因为编译器不知道实际类型具体是什么子类
常见误用提醒
注意 super 和 extends 不可混用,也不能同时出现在同一个通配符里。
立即学习“Java免费学习笔记(深入)”;
- ❌ 错误写法:
List<? super String extends Object>—— 语法非法 - ✅ 正确选择:
? super String(用于写入 String 或其父类容器)或? extends CharSequence(用于读取,且只读 CharSequence 及其子类) - 记住口诀:“PECS” —— Producer Extends, Consumer Super。你要从集合取数据(Producer),用
extends;你要往集合塞数据(Consumer),用super
实际例子:一个通用的插入工具方法
假设你想写一个方法,把一批 Integer 值加进任意“能装 Integer 或更高类型”的列表:
public static void batchAdd(List<? super Integer> target, Integer... values) {
for (Integer v : values) {
target.add(v); // 安全:v 是 Integer,target 至少能存 Integer 或其父类
}
}
- 可以传
ArrayList<Integer>、ArrayList<Number>、ArrayList<Object> - 但不能传
ArrayList<String>或ArrayList<Comparable>(后者虽与 Integer 有共同接口,但无继承关系)

















