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:消费者,使用下界通配符作为参数类型

相关推荐
chase。11 小时前
Python包构建工具完全指南:python -m build 使用详解
开发语言·chrome·python
SuperEugene11 小时前
前端 utils 工具函数规范:拆分 / 命名 / 复用全指南,避开全局污染等高频坑|编码语法规范篇
开发语言·前端·javascript
夕颜11112 小时前
Skill 与 MCP Function:傻傻分不清楚?
后端
GoodStudyAndDayDayUp12 小时前
RUO-VUE-PRO权限关联sql
java·数据库·sql
古城小栈12 小时前
Go 底层代码的完整分类
开发语言·后端·golang
码界奇点12 小时前
基于Spring Boot和MyBatis的图书管理系统设计与实现
spring boot·后端·车载系统·毕业设计·mybatis·源代码管理
耳冉鹅12 小时前
Go无锁共享内存环形缓冲区设计
开发语言·golang
轩情吖12 小时前
MySQL之事务管理
android·后端·mysql·adb·事务·隔离性·原子性
⑩-12 小时前
RabbitMQ 架构和工作原理?RabbitMQ 延迟队列如何实现?
java·分布式·架构·rabbitmq
计算机安禾12 小时前
【C语言程序设计】第36篇:二进制文件的读写
c语言·开发语言·c++·算法·github·visual studio code·visual studio