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

相关推荐
abcnull1 小时前
用javaparser做精准测试
java·ast·静态代码分析·精准测试·javaparser
叶小鸡1 小时前
Java 篇-项目实战-苍穹外卖-笔记汇总
java·开发语言·笔记
AI人工智能+电脑小能手2 小时前
【大白话说Java面试题】【Java基础篇】第22题:HashMap 和 HashSet 有哪些区别
java·开发语言·哈希算法·散列表·hash
juniperhan2 小时前
Flink 系列第21篇:Flink SQL 函数与 UDF 全解读:类型推导、开发要点与 Module 扩展
java·大数据·数据仓库·分布式·sql·flink
ID_180079054732 小时前
Python 实现亚马逊商品详情 API 数据准确性校验(极简可用 + JSON 参考)
java·python·json
c++之路2 小时前
C++23概述
java·c++·c++23
时空系2 小时前
第10篇:继承扩展——面向对象编程进阶 python中文编程
开发语言·python·ai编程
专注API从业者3 小时前
Open Claw 京东商品监控选品实战:一键抓取、实时监控、高效选品
java·服务器·数据库
CHANG_THE_WORLD3 小时前
python 批量终止进程exe
开发语言·python
摇滚侠3 小时前
DBeaver 导入数据库 导入 SQL 文件 MySQL 备份恢复
java·数据库·mysql