Java泛型通配符核心是类型安全下的灵活适配:只读用(仅支持Object级方法)。严格遵循PECS原则——Producer Extends、Consumer Super。

Java 泛型通配符不是为了“绕开类型检查”,而是让 API 在保持类型安全的前提下,能接受更合理的类型范围。关键在于明确参数的读写意图,并据此选择 ? extends T、? super T 或 ?。
只读场景用 ? extends T
当方法只从集合中读取元素,并把它们当作 T 类型来使用时,上界通配符最合适。
- 声明形如
List extends Number>,可接收List<integer></integer>、List<double></double>、List<number></number> - 能安全调用
get(),返回值可直接赋给Number变量(例如Number n = list.get(0);) - 不能调用
add()—— 编译器无法确认你加的对象是否属于该未知子类型(比如往List extends Number>中加Float,而实际是List<integer></integer>就会破坏类型安全)
只写场景用 ? super T
当方法主要向集合中添加 T 类型的实例,且希望目标集合类型可以更宽泛(比如接受父类容器)时,下界通配符是唯一选择。
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
- 声明形如
List super Integer>,可接收List<integer></integer>、List<number></number>、List<object></object> - 能安全调用
add(new Integer(42))—— 因为Integer是所有这些类型的子类或本身 - 读取时只能按
Object处理(例如Object o = list.get(0);),因为具体上界不确定,无法保证返回值是更具体的类型
纯通用操作用 ?
当方法不依赖元素具体类型,只调用 Object 层的方法(如 toString()、equals()、hashCode())时,无界通配符最简洁。
立即学习“Java免费学习笔记(深入)”;
- 声明形如
List>,可接收任意List<x></x>(X为任意具体类型) - 遍历时只能用
Object接收元素(例如for (Object item : list)) - 不能调用
add()—— 连Object都不能加,因为编译器无法确保不破坏内部一致性(比如向传入的List<string></string>对应的List>中加一个Integer就会出错)
牢记 PECS 原则
这是理解三者分工的口诀:Producer Extends、Consumer Super。
- Producer(生产者)→ 读取数据 → ? extends T
- Consumer(消费者)→ 写入数据 → ? super T
- 像
copy(List extends T> src, List super T> dest)这样的方法设计,就是 PECS 的典型体现

















