java通配符上限用? extends t(只读,可安全读取为t)、下限用? super t(只写,可安全写入t及其子类),二者互斥且不可共存,无界通配符?等价于? extends object,super仅用于通配符不可用于类型参数声明。

Java 中限制通配符的上下限,靠的是 ? extends T(上限)和 ? super T(下限)两种语法,它们只用于通配符 ?,不能用在类型参数声明(比如 T super String 是非法的)。
通配符上限:? extends T
表示该通配符代表的类型必须是 T 或 T 的子类。编译器据此允许你安全地读取元素,并将其当作 T 类型使用。
- 适用于“只读”场景(Producer),比如遍历、获取最大值、计算总和等
- 不能向集合中添加任何元素(除了
null),因为编译器无法确定具体子类型 - 例如:
List extends Number>可接收List<integer></integer>、List<double></double>,但不能 add(1) - 方法内可调用
Number定义的方法,如doubleValue()、intValue()
通配符下限:? super T
表示该通配符代表的类型必须是 T 或 T 的父类(包括 T 自身)。编译器据此允许你安全地写入 T 类型或其子类型的实例。
- 适用于“只写”场景(Consumer),比如向集合批量添加元素
- 可以添加
T或其子类对象(如往List super Integer>中 add(5)、add(new AtomicInteger(1))) - 但读取时只能得到
Object,因为上界不确定 - 典型例子:
Collections.<t>addAll(Collection super T>, T...)</t>
上下限不能共存
Java 不支持类似 ? extends Number & super Integer 这样的写法——通配符只能有且仅有一个边界,要么是上限,要么是下限。
-
? extends Number和? super Integer语义不同,用途互斥,不能叠加 - 若需兼顾读写,应直接使用具体类型(如
List<integer></integer>)或重新设计 API - 无界通配符
?相当于? extends Object,读写都受限(只能读为Object,不能安全写)
常见误用提醒
这些写法在编译期会报错,需要特别注意:
-
<t super number></t>——super不能用于类型参数声明,只属于通配符 -
List extends Integer & Comparable<integer>></integer>—— 通配符不支持多边界 -
new ArrayList super String>()—— 不能用带边界的通配符创建实例,只能用于变量声明或参数 - 把
? super T当作返回类型来“取值并强转”——读出的是Object,没有类型保证
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











