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

相关推荐
高频因子挖掘机2 小时前
A股分钟K线数据占内存:先缩小请求范围,还是换 DataFrame 工具?
后端·github·api
高级程序源2 小时前
springboot大学生体测系统72170-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·python·django·课程设计
谢亮_vipxieliang2 小时前
JavaScript this 指向完全指南:调用位置决定一切
开发语言·javascript·ecmascript
IT研究室2 小时前
最新计算机毕业设计选题推荐-基于spring boot的文学名著分享系统-网站-文档指导-Java-springboot
java·spring boot·课程设计
denlaku2 小时前
JDK 13 新特性详解
java·开发语言
秋饼2 小时前
Java 后端企业级 LLM 网关实战:Spring Cloud Gateway 构建统一大模型接入层
java·ai·技术分享·后端开发
打工仔折腾 AI2 小时前
极空间用 Docker 部署 Photopea:网页版 PS 的私有化实践
运维·后端·python·docker·容器·langchain·ai agent 实战
今年下半年3 小时前
【防重放】Spring Boot 通过自定义注解实现接口防重放
java·spring boot·自定义注解·防重放
念越3 小时前
题库、练习与错题本代码阅读
开发语言·数据结构
WeiXin_DZbishe3 小时前
基于Node.js的马拉松赛事管理系统的设计与实现-计算机毕设 附源码【课程设计】90211
java·javascript·vue.js·python·php·课程设计