Java 泛型 - Java 泛型通配符(上界通配符、下界通配符、无界通配符、PECS 原则)

一、上界通配符

  • 上界通配符 ? extends T,表示 T 或 T 的任意子类型,只能读取,不能写入
java 复制代码
List<? extends Number> list = new ArrayList<Integer>(List.of(1, 2, 3));

Number num = list.get(0); // 安全读取为 Number
java 复制代码
// 不能写入 Integer 类型,因为无法确定具体类型,list 可能是 List<Integer>,也可能是 List<Double> 等

public void test_write(List<? extends Number> list) {
    list.add(new Integer(100));
}
java 复制代码
// 除了写入 null

public void test_write(List<? extends Number> list) {
    list.add(null);
}

二、下界通配符

  • 下界通配符,? super T,表示 T 或 T 的任意父类型
java 复制代码
List<? super Integer> list = new ArrayList<Number>();

list.add(new Integer(1)); // 安全,Integer 是 Number 子类
java 复制代码
// 只能读取为 Object,因为无法确定具体类型,list 可能是 List<Integer>,也可能是 List<Number> 等

public void test_read(List<? super Integer> list) {
    Object obj = list.get(0);
}

三、无界通配符

  • 无界通配符,?,表示任意类型,只读为 Object
java 复制代码
// 不能写入,因为无法确定具体类型,list 可能是 List<Dog>,也可能是 List<Cat> 等
// 只能读取为 Object,因为无法确定具体类型,list 可能是 List<Dog>,也可能是 List<Cat> 等

void process(List<?> list) {
    for (Object obj : list) {
    }
}

PECS 原则

  • PECS,全称 Producer Extends Consumer Super,用于指导泛型通配符的使用
  1. Producer Extends:生产者,使用上界通配符作为返回类型

  2. Consumer Super:消费者,使用下界通配符作为参数类型

相关推荐
starzy199044 分钟前
Scala循环与判断:一切皆表达式的控制流
开发语言·人工智能·scala
wangbing11251 小时前
平台介绍-modbus设备调试
java
starzy19901 小时前
Scala类和对象:从构造器到样例类的完整指南
开发语言·后端·scala
梦影_1 小时前
MySQL进阶教程(五)—— SQL调优(下)
android·大数据·数据库·后端·sql·mysql·database
考虑考虑1 小时前
mariadb数据库
数据库·后端·mariadb
niucloud-admin1 小时前
NIUCLOUD PHP SAAS上门家政使用文档--服务订单:订单列表
开发语言·php
西索斯coding1 小时前
gpt-image-2.5-sunburst 和 gemini-3.1-flash-image 差多少?60 组项目素材的成功成本评测框架
java·linux·gpt·ai
明月_清风1 小时前
用自然语言操控真机:Google Artemis 移动端 AI Agent 上手与实践
人工智能·后端
怪我冷i2 小时前
Rust 的impl语法详解
开发语言·后端·rust
wuminyu2 小时前
Java字节码学习总结:字节码如何加载、解析和执行
java·linux·c语言·jvm·c++