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
相关推荐
guodingdingh1 天前
软件开发工作问题总结0718
java·开发语言·数据库
咖啡八杯1 天前
GoF设计模式——解释器模式
java·后端·spring·设计模式
优橙教育1 天前
5G网优培训 vs Java开发:转行选哪个?
java·开发语言·5g
糖果店的幽灵1 天前
【DeepAgents 从入门到精通】Context Management 上下文管理
java·人工智能·后端·spring·中间件·langgraph·deepagents
腻害兔1 天前
【若依项目-产品经理视角】RuoYi-Vue-Pro 源码拆解:字典、短信、邮件、通知——后台系统的“基础设施四件套“!
java·前端·vue.js·产品经理·ai编程
碎光拾影1 天前
ARM交叉工具链各工具作用及IMX6ULL平台LED+蜂鸣器裸机程序实现
java·开发语言·数据库
Miao121311 天前
微服务 API 测试实践:海外某民宿平台如何构建模式驱动测试基础设施
java·开发语言
腻害兔1 天前
【若依项目-产品经理视角】RuoYi-Vue-Pro 源码拆解:支付模块 yudao-module-pay,一个让产品经理都看懂的支付中台设计
java·前端·vue.js·产品经理·ai编程
CRMEB系统商城1 天前
开源自建还是SaaS订阅?算一笔3年经济账
java·大数据·开发语言·开源
keyipatience1 天前
线程栈与TLS和线程互斥
java·linux·服务器·开发语言·ubuntu