Java泛型通配符不是语法糖,而是解决泛型不变性兼容问题的关键机制;无界通配符?表示未知类型,只读不可写(除null),适用于遍历、统计等只读场景。

Java 泛型通配符(Wildcard)不是语法糖,而是解决泛型类型“不变性”带来的兼容性问题的关键机制。它让方法能安全地接收不同具体类型的泛型集合,同时守住编译期类型安全底线。
无界通配符 >:只读通用容器
当方法只需遍历、检查或传递集合,不修改内容时,> 是最轻量的选择。
- 可读:所有元素按 Object 类型读取,无需强制转换
- 不可写:除 null 外,任何 add 操作都会编译失败——因为编译器无法验证类型合法性
- 典型用途:工具类中的打印、统计、校验方法,例如
public static void logSize(List> list)
上界通配符 extends T>:作为生产者(Producer)
表示“某个 T 的子类型”,适用于从集合中**读取统一上层视图**的场景,比如把 List<Integer>、List<Double> 都当作 Number 来处理。
- 可读:get() 返回值可安全赋给 T 或其父类型(如
Number n = list.get(0)) - 不可写:add() 禁止(连 T 实例也不允许),因实际类型可能是 Integer、Float 等任意子类,写入会破坏类型一致性
- 常见于:数值计算工具、UI 组件的数据源适配、框架中返回“只读视图”的 API
下界通配符 super T>:作为消费者(Consumer)
表示“某个 T 的父类型”,适用于向集合中**写入统一子类型**的场景,比如把 Integer 添加到 List<Number> 或 List<Object> 中。
立即学习“Java免费学习笔记(深入)”;
- 可写:可以 add T 及其子类型 的实例(如
list.add(new Integer(42))) - 可读但受限:get() 返回值只能视为 Object,无法直接转为 T(因实际类型可能比 T 更宽)
- 典型用法:集合批量填充、回调收集器、日志聚合器等需要“收数据”的逻辑
PECS 原则:一句话记住边界选择
Producer Extends, Consumer Super —— 这是判断该用 extends 还是 super 的核心口诀。
- 如果你的方法主要从泛型参数中取出数据(生产),就用 ? extends T
- 如果你的方法主要向泛型参数中放入数据(消费),就用 ? super T
- 如果既不取也不放,仅作传递或判空, > 就足够了


















