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
相关推荐
FQNmxDG4S5 小时前
Java多线程编程:Thread与Runnable的并发控制
java·开发语言
虹科网络安全6 小时前
艾体宝干货|数据复制详解:类型、原理与适用场景
java·开发语言·数据库
axng pmje7 小时前
Java语法进阶
java·开发语言·jvm
rKWP8gKv77 小时前
Java微服务性能监控:Prometheus与Grafana集成方案
java·微服务·prometheus
老前端的功夫7 小时前
【Java从入门到入土】28:Stream API:告别for循环的新时代
java·开发语言·python
qq_435287927 小时前
第9章 夸父逐日与后羿射日:死循环与进程终止?十个太阳同时值班的并行冲突
java·开发语言·git·死循环·进程终止·并行冲突·夸父逐日
小江的记录本7 小时前
【Kafka核心】架构模型:Producer、Broker、Consumer、Consumer Group、Topic、Partition、Replica
java·数据库·分布式·后端·搜索引擎·架构·kafka
yaoxin5211237 小时前
397. Java 文件操作基础 - 创建常规文件与临时文件
java·开发语言·python
极客先躯9 小时前
高级java每日一道面试题-2025年11月24日-容器与虚拟化题[Dockerj]-runc 的作用是什么?
java·oci 的命令行工具·最小可用·无守护进程·完全标准·创建容器的核心流程·runc 核心职责思维导图
用户60648767188969 小时前
AI 抢不走的技能:用 Claude API 构建自动化工作流实战
java