? super T 表示容器实际类型为T或其父类,允许写入T及子类实例但读取只能赋给Object;它仅用于通配符,不可用于泛型类声明,典型用途是消费数据的通用方法。

Java 中泛型下限 ? super T 并不是用来“限制传入父类”,而是告诉编译器:这个泛型容器**实际承载的类型是 T 或它的某个父类**,从而允许安全地向其中写入 T 类型(或其子类)的实例。
将后端 Java 接口文档转换为前端 TypeScript 类型定义(interface / type)。输入:飞书文档、Spring Boot 接口文档、Swagger/OpenAPI、手写 API 文档等。输出:包含请求参数与响应结果的 .md 文件,含完整 JSDoc 注释。触发关键词:Java 转 TS、接口转换、生成前端类型、接口文档转 TypeScript、DTO/VO/BO 转 interface、后端文档转前端类型、生成接口类型、类型定义生成。
它不控制你“传入什么父类”,而是约束容器能接受的类型范围
比如声明:List super Integer> list;
这表示 list 实际引用的对象可能是:
- ArrayList<integer></integer>
- ArrayList<number></number>
- ArrayList<object></object>
但不能是 ArrayList<string></string>(和 Integer 无继承关系)或 ArrayList<long></long>(虽同为 Number 子类,但不是 Integer 的父类)。
为什么只能写入 T,不能读成 T?
- ✅ 写入安全:因为无论真实类型是
Number还是Object,它们都能接收Integer(T 本身)或new AtomicInteger()(T 的子类) - ❌ 读取受限:
list.get(0)返回的可能是Number、Object,甚至更具体的Integer,但编译器只知道“至少是 Object”,所以只能赋给Object类型变量
常见误用:试图用 ? super T 声明泛型类参数
下面写法是非法的:class Box<t super integer> { ... }</t>
Java 不允许在泛型类型形参中使用 super。下界只适用于通配符(?),不能用于 <t extends ...></t> 这类声明。
典型用途:消费数据的通用方法
比如一个收集整数的方法:
public static void addIntegers(List<? super Integer> target, int... values) {<br>
for (int v : values) target.add(v);<br>
}它可以安全地往
ArrayList<number></number> 或 LinkedList<object></object> 里添加 int 值,而无需强制转换或牺牲类型安全。

















