下限通配符 ? super t 限定类型必须是 t 或其任意父类,如 list

下限通配符 ? super T 的本质限制
它不是“限制类型变窄”,而是**限定类型必须是 T 或 T 的任意父类**。例如 List super Integer> 可以接受 List<integer></integer>、List<number></number>、List<object></object>,但不能接受 List<string></string> 或 List<double></double> —— 因为这些类型与 Integer 无继承关系。
写入安全:只允许添加 T 及其子类
编译器能保证:T 类型的对象一定可以赋值给其任意父类类型。因此你可以安全地调用 add():
-
list.add(new Integer(42))✅ 合法(Integer是所有允许类型的子类或本身) -
list.add(new Long(100))❌ 编译错误(Long不是Integer的子类,无法保证兼容性) -
list.add(new Number())❌ 编译错误(Number是父类,但实际容器可能是List<integer></integer>,加Number会破坏类型安全)
读取受限:只能按 Object 接收
由于具体类型未知(可能是 Integer、Number 或 Object),编译器无法给出比 Object 更具体的返回类型:
-
Object o = list.get(0)✅ 合法 -
Integer i = list.get(0)❌ 编译错误 -
Number n = list.get(0)❌ 编译错误
典型使用场景:数据消费者
当方法的核心职责是「接收并存储 T 类型的数据」时,用 ? super T 能扩大适配范围:
- 通用拷贝方法的目标列表:
void copy(List extends T> src, List super T> dest) - 收集日志、聚合结果、批量插入等写入密集型操作
- 避免方法签名过度绑定到具体父类,比如不写死
List<number></number>,而支持更宽泛的输入











