泛型通配符在方法参数中用于安全读写多种相关类型:?适配任意类型(只读,返回Object);<? extends T>支持安全读取T及其子类(如Number),不可写入;<? super T>支持安全写入T及其子类到父类容器(如Object),读取仅得Object;二者遵循PECS原则,与泛型方法互补而非替代。

在方法参数中用泛型通配符,核心是让方法能安全地读取或写入多种相关类型的数据,而不是被绑定到某一个具体泛型类型上。它不改变方法逻辑,但大幅拓宽可接收的参数范围,同时保持编译期类型检查。
用 ?(无界通配符)适配任意类型集合
当方法只做遍历、打印、统计等只读操作,且不关心元素具体是什么类型时,List<?> 是最轻量的选择。
- 能接收
List<String>、List<Integer>、List<User>等所有泛型列表 - 调用
get()返回的是Object,需手动转型(若必须用具体类型,说明此处更适合用泛型方法而非通配符) - 不能调用
add()—— 编译器无法确认你加进去的对象是否合法
用 ? extends T(上界通配符)安全读取子类数据
适用于需要调用元素共有的方法(如 doubleValue()、toString()、compareTo()),且输入集合类型不确定但都属于某个父类型体系。
用于 inference.sh 的 JavaScript/TypeScript SDK,可运行 AI 应用、构建代理、集成 150+ 模型。包名:@inferencesh/sdk(npm install),完整 TypeScript 支持。
-
public static double sum(List<? extends Number> list)可传入List<Integer>或List<BigDecimal> - 能安全调用
item.doubleValue(),因为所有Number子类都支持 - 仍不能
add()具体对象(除了null),因为编译器不知道该集合实际允许哪种子类型
用 ? super T(下界通配符)安全写入父类容器
当你需要把某种类型的数据“塞进去”,而目标容器可能是更宽泛的类型时,下界通配符是唯一安全的选择。
立即学习“Java免费学习笔记(深入)”;
public static void addIntegers(Collection<? super Integer> target, List<Integer> source)- 可传入
Collection<Integer>、Collection<Number>或Collection<Object> - 可以放心调用
target.add(new Integer(42)),因为Integer是所有这些类型的子类型 - 但
get()返回的是Object,无法直接当作Integer用
别混淆:通配符不是替代泛型方法,而是互补使用
泛型方法(如 <T> T max(List<T>))强调“同一调用中类型一致且可推断”;通配符强调“放宽输入限制,聚焦读/写能力边界”。两者常组合出现:
- Collections.max 的签名是
<T extends Object & Comparable<? super T>> T max(Collection<? extends T> coll) - 这里既用了泛型参数
T来统一返回类型和比较逻辑,又用? extends T放宽输入集合类型,还用? super T支持compareTo的逆变调用

















