一、为什么需要通配符?
泛型让代码更安全、更灵活,但在某些情况下,类型参数不能确定(比如方法参数既要接收 List 又要接收 List),这时就需要 通配符(Wildcard)。
二、三种常见通配符
1. 无界通配符 <?>
表示"任意类型"。
java
public void printList(List<?> list) {
for (Object obj : list) {
System.out.println(obj);
}
}
✅ 可以读取元素
❌ 不能添加(除了 null)
2. 上界通配符 <? extends T>
表示「类型是 T 或 T 的子类」,常用于 只读场景。
java
public double sum(List<? extends Number> list) {
double total = 0;
for (Number n : list) total += n.doubleValue();
return total;
}
✅ 可以安全读取为 T 类型
❌ 不能往里放(除了 null)
3. 下界通配符 <? super T>
表示「类型是 T 或 T 的父类」,常用于 写入场景。
java
public void addIntegers(List<? super Integer> list) {
list.add(1);
list.add(2);
}
✅ 可以安全写入 T 或其子类
❌ 读取只能得到 Object
三、小结
| 通配符 | 读 | 写 | 典型用法 |
|---|---|---|---|
<?> |
✅ | ❌ | 只读(打印、遍历) |
<? extends T> |
✅ | ❌ | 上界:只读 T |
<? super T> |
❌ | ✅ | 下界:安全写入 |
📖 口诀:PECS 原则
- Producer Extends → 生产者用 extends
- Consumer Super → 消费者用 super