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
相关推荐
C雨后彩虹3 小时前
任务最优调度
java·数据结构·算法·华为·面试
heartbeat..3 小时前
Spring AOP 全面详解(通俗易懂 + 核心知识点 + 完整案例)
java·数据库·spring·aop
Jing_jing_X3 小时前
AI分析不同阶层思维 二:Spring 的事务在什么情况下会失效?
java·spring·架构·提升·薪资
元Y亨H5 小时前
Nacos - 服务发现
java·微服务
微露清风5 小时前
系统性学习C++-第十八讲-封装红黑树实现myset与mymap
java·c++·学习
dasi02275 小时前
Java趣闻
java
阿波罗尼亚6 小时前
Tcp SSE Utils
android·java·tcp/ip
susu10830189116 小时前
springboot3.5.8整合minio8.5.9
java·springboot
不知道累,只知道类6 小时前
深入理解 Java 虚拟线程 (Project Loom)
java·开发语言
myzshare7 小时前
实战分享:我是如何用SSM框架开发出一个完整项目的
java·mysql·spring cloud·微信小程序