Java 通配符

一、为什么需要通配符?

泛型让代码更安全、更灵活,但在某些情况下,类型参数不能确定(比如方法参数既要接收 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
相关推荐
Merrick7 小时前
Java 方法参数默认值新方案:使用DefArgs!
java·后端
程序员小假7 小时前
finally 释放的是什么资源?
java·后端
技术砖家--Felix7 小时前
Spring Boot配置篇:详解application.properties和application.yml
java·spring boot·后端
2301_801252227 小时前
Mybatis的添加和修改功能
java·开发语言·mybatis
安迪西嵌入式8 小时前
数据平滑处理算法03——中心移动平均
java·前端·算法
行思理8 小时前
IntelliJIdea 创建java spring boot程序
java·开发语言·spring boot
钻仰弥坚8 小时前
在线考试系统设计说明文档(需求分析部分)
java·需求分析
BugShare8 小时前
嘿嘿,猜我刚刚发现了什么?IDEA全新UI,极致优雅贼好看!
java·idea
用户3777967210968 小时前
90% 开发者踩过的坑:事务嵌套第三方接口的风险破解与实践
java