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
相关推荐
g***B73822 分钟前
Java 工程复杂性的真正来源:从语言设计到现代架构的全链路解析
java·人工智能·架构
期待のcode2 小时前
MyBatisX插件
java·数据库·后端·mybatis·springboot
醇氧5 小时前
【Windows】优雅启动:解析一个 Java 服务的后台启动脚本
java·开发语言·windows
sunxunyong5 小时前
doris运维命令
java·运维·数据库
菜鸟起航ing5 小时前
Spring AI 全方位指南:从基础入门到高级实战
java·人工智能·spring
古城小栈5 小时前
Docker 多阶段构建:Go_Java 镜像瘦身运动
java·docker·golang
MapGIS技术支持5 小时前
MapGIS Objects Java计算一个三维点到平面的距离
java·开发语言·平面·制图·mapgis
Coder_Boy_6 小时前
业务导向型技术日志首日记录(业务中使用的技术栈)
java·驱动开发·微服务
盖世英雄酱581367 小时前
springboot 项目 从jdk 8 升级到jdk21 会面临哪些问题
java·后端
济南壹软网络科技有限公司7 小时前
企业级盲盒系统:Java高并发架构在多元化抽奖电商中的设计与实践
java·架构·开源源码·盲盒源码·盲盒h5·盲盒app