java泛型通配符的核心是用?、? extends t、? super t在编译期保障类型安全并扩展适配性:list用于纯结构操作,list与list。

Java 中用泛型通配符处理未知类型集合,关键不是“绕过类型检查”,而是用 ?、? extends T、? super T 三类表达式,在编译期守住安全底线的同时扩大参数适配范围。核心在于分清场景:只读、只写,还是纯结构操作。
用 List> 做纯结构操作
当你只需要获取集合大小、遍历打印、判空或转数组,完全不关心元素具体类型时,List> 是最轻量的选择:
- 能调用
size()、isEmpty()、iterator()、toArray()等方法 - 遍历时所有元素视为
Object,可直接System.out.println(o) - 禁止调用
add()、addAll()(连new Object()都不行),唯一允许加的是null - 不能用于声明泛型类或方法,比如
class Box>是非法的
用 List extends T> 安全读取子类集合
当方法要从集合里取数据,并把每个元素当作 T 使用(比如统一转成 double 或调用 T 的公共方法),就用上界通配符:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 例如
List extends Number>可接收List<integer></integer>、List<bigdecimal></bigdecimal>、List<number></number> - 能安全调用
get(i),返回值可直接赋给Number类型变量 - 不能调用
add()——编译器不知道实际类型,加Float到List extends Number>可能实际是List<integer></integer>,会破坏类型一致性 - 典型口诀:Producer 使用 extends(集合是数据“生产者”)
用 List super T> 安全写入父类集合
当方法主要往集合里塞 T 类型对象,且希望支持更宽泛的目标类型(比如既接受 List<string></string>,也接受 List<object></object>),就用下界通配符:
- 例如
List super String>可接收List<string></string>、List<charsequence></charsequence>、List<object></object> - 能安全调用
add(new String("ok")),因为String是所有这些类型的子类或本身 - 读取时只能按
Object处理,比如Object o = list.get(0),无法直接当String用 - 典型口诀:Consumer 使用 super(集合是数据“消费者”)
别踩这些常见坑
通配符不是万能占位符,几个高频误区得避开:
-
List>不等于List<object></object>,二者没有继承关系 -
void copy(List> src, List> dest)中两个?彼此独立,不能保证类型一致;真要类型匹配,得用泛型方法<t> void copy(List<t> src, List<t> dest)</t></t></t> - 不要为了“让代码编译通过”而硬套
?,如果方法内部需要强转或调用子类特有方法,说明设计可能需要重构 - 泛型擦除意味着运行时无法获取真实类型,所有类型约束都在编译期完成,所以通配符的安全性是静态保障
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










