当前位置: 首页 > news >正文

JAVA-泛型通配符的上界和下界

在 Java 泛型中,通配符(Wildcard) 用于表示未知的类型。为了增强灵活性和安全性,Java 提供了对通配符的上界(Upper Bound)下界(Lower Bound) 的限制。


🟢 一、通配符概述

  • 基本通配符:?
    • 表示未知类型。
    • 示例:List<?> 表示一个元素类型未知的列表。

⚠️ 使用 List<?> 后,不能向其中添加除 null 外的任何元素(因为编译器不知道具体类型),但可以读取为 Object


🔺 二、通配符的上界(Upper Bound Wildcard)

✅ 语法:

? extends T
  • 表示“某个未知类型,它是 T 的子类型”。
  • 适用于“只读不写”的场景。

✅ 示例:

List<? extends Number> list = new ArrayList<Integer>();
  • 可以读取元素为 Number 类型:

    Number num = list.get(0);
    
  • ❌ 不允许添加元素(除了 null):

    list.add(123); // 编译错误!不知道实际类型是 Integer 还是 Double 等
    

✅ 用途:

  • 当你只需要从集合中读取数据,并希望它能接受多种子类型时使用。

🔻 三、通配符的下界(Lower Bound Wildcard)

✅ 语法:

? super T
  • 表示“某个未知类型,它是 T 的父类型”。
  • 适用于“只写不读”的场景。

✅ 示例:

List<? super Integer> list = new ArrayList<Number>();
  • ✅ 可以添加 Integer 类型的对象:

    list.add(10);
    
  • ❌ 读取时只能作为 Object 类型:

    Object obj = list.get(0); // 无法知道具体是 Number、Object 还是其他父类
    

✅ 用途:

  • 当你需要将某种具体类型的数据写入集合,并且该集合的类型必须是它的父类时使用。

🟡 四、对比总结

通配符形式含义可否添加元素可否读取元素典型用途
?任意类型✅(作为 Object通用只读集合
? extends TT 或其子类✅(作为 T读取特定类型的集合
? super TT 或其父类✅(作为 Object写入特定类型的集合

🧠 小技巧:PECS 原则(Producer Extends, Consumer Super)

这是理解泛型通配符的经典原则:

  • Producer(生产者) → 使用 extends(只读)
  • Consumer(消费者) → 使用 super(只写)

示例代码:

public static void copy(List<? extends Number> source,List<? super Number> dest) {for (Number number : source) {dest.add(number); // 写入到 dest}
}

📝 总结

  • 使用 ? extends T 来限定上界,适合读操作。
  • 使用 ? super T 来限定下界,适合写操作。
  • 结合 PECS 原则,可以更安全地使用泛型集合。
http://www.lryc.cn/news/576079.html

相关文章:

  • UUDS—常见NRC及其含义
  • 中国双非高校经费TOP榜数据分析
  • ROS:录制相机、IMU、GNSS等设备数据
  • gRPC技术解析与python示例
  • 楼宇自控系统以智能化管控,全方位满足建筑节约、安全与可靠运行需求
  • 像素之外的智慧:Adobe AI在动态影像与云端协作中的进阶应用
  • 如何设置 Java 的环境变量
  • 23种设计模式——单例模式的暗黑面
  • LLaMA-Factory 对 omnisql 进行 ppo dpo grpo nl2sql任务 实现难度 时间 全面对比
  • 【.net core】【sqlsugar】在where条件查询时使用原生SQL
  • spring-ai 1.0.0 学习(十八)——MCP Server
  • 修复opensuse 风滚草rabbitmq的Error: :plugins_dir_does_not_exist问题
  • 【C语言】知识总结·指针篇
  • linux dts overlay
  • Spearman检验组间相关性及SCI风格绘图
  • 基于社区电商场景的Redis缓存架构实战01-redis内核知识
  • 航拍图像中的“生命线”:基于YOLOv5的7类应急目标检测实践
  • 打造无障碍网页应用的利器:Base UI
  • Python爬虫实战:如何优雅地处理超时和延迟加载问题
  • 安全运营中的漏洞管理和相关KPI
  • 车载以太网-ARP 动态 静态
  • html配置rem实现页面自适应
  • Day57打卡 @浙大疏锦行
  • Go和Elixir极简HTTP服务对比
  • Linux 挂载从入门到精通:mount 命令详解与实战指南
  • 创建一个简单入门SpringBoot3项目
  • Spring Boot项目开发实战销售管理系统——系统设计!
  • Formality:原语(primitive)的概念
  • 中科亿海微SoM模组——基于FPGA+RSIC-V的计算机板卡
  • AI助力游戏设计——从灵感到行动-靠岸篇