java中super关键字用于泛型下限边界,语法为? super t,表示通配符类型必须是t或其父类;核心用途是“写入安全”,如list

Java 中用 super 关键字限制泛型类型的下限边界,意思是:通配符所代表的类型必须是某个指定类,或它的任意父类(包括 Object)。
下限边界的基本写法
语法形式为 ? super T,其中 T 是你指定的“下限类型”。它不表示“T 的子类”,而是“T 本身或其所有父类”。
-
List super Integer>可以接受List<integer></integer>、List<number></number>、List<object></object> - 但不能接受
List<long></long>或List<string></string>—— 它们和 Integer 没有父子关系
为什么需要下限?核心用途是“写入安全”
当你需要往集合中添加元素,又希望方法能兼容更宽泛的类型时,下限就派上用场了。因为只有知道目标类型至少是 T 或更高(即父类),才能保证 add(T) 操作是类型安全的。
- 例如:
void addNumbers(List super Integer> list)中,你可以放心调用list.add(new Integer(42)) - 如果传入的是
List<number></number>,Integer 是 Number 的子类,add 合法;如果是List<object></object>,Integer 当然也能放进 Object 容器 - 但如果用
? extends Integer,你就不能 add 任何东西(除了 null),因为编译器不知道实际类型具体是什么子类
常见误用提醒
注意 super 和 extends 不可混用,也不能同时出现在同一个通配符里。
- ❌ 错误写法:
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></integer>、ArrayList<number></number>、ArrayList<object></object> - 但不能传
ArrayList<string></string>或ArrayList<comparable></comparable>(后者虽与 Integer 有共同接口,但无继承关系)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











