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

Java的extends通配符

在Java泛型中,extends通配符用于限定泛型类型的上界,即指定泛型可以是某个类型或其子类型。它有两种常见用法:类型参数限定通配符限定,下面详细介绍:

1. 类型参数限定(在类/方法定义中)

在定义泛型类或方法时,使用extends关键字限制泛型类型必须是某个类(或接口)的子类。
语法<T extends 上限类型>

  • 示例1:限定泛型为Number的子类
    // 泛型类:T必须是Number或其子类(如Integer、Double)
    class GenericClass<T extends Number> {private T value;public GenericClass(T value) {this.value = value;}public double getDoubleValue() {return value.doubleValue(); // 可调用Number的方法}
    }// 使用:
    GenericClass<Integer> intClass = new GenericClass<>(10);  // 合法
    GenericClass<String> strClass = new GenericClass<>("abc");  // 编译错误(String不是Number子类)
    
  • 示例2:限定多个接口(用&分隔)
    // T必须同时实现Comparable和Serializable接口
    class MultiInterface<T extends Comparable<T> & Serializable> {// ...
    }
    

2. 通配符限定(在方法参数或变量声明中)

使用? extends 上限类型表示未知类型,但必须是指定类型的子类,常用于读取数据(因为写入时类型不确定)。
语法? extends 上限类型

  • 示例1:方法参数中使用通配符
    // 只能处理Number或其子类的容器,且只能读取数据
    public static void printNumbers(Collection<? extends Number> nums) {for (Number num : nums) {System.out.println(num);}// nums.add(10);  // 编译错误:无法向通配符类型添加元素
    }// 使用:
    List<Integer> intList = Arrays.asList(1, 2, 3);
    printNumbers(intList);  // 合法
    List<String> strList = Arrays.asList("a", "b");
    printNumbers(strList);  // 编译错误(String不是Number子类)
    
  • 示例2:通配符与泛型类结合
    class Box<T> {private T value;// ... getter/setter
    }// 定义一个方法,接收"上限为Number"的Box,只能读取
    public static void processBox(Box<? extends Number> box) {Number num = box.getValue();  // 合法// box.setValue(10);  // 编译错误:无法确定具体类型
    }
    

3. extends通配符的核心规则

  • 只读原则? extends T类型的集合只能读取元素(返回类型为T或其父类),不能写入元素(因为无法确定具体类型)。
    例如:List<? extends Number>可以读取Number,但无法添加任何元素(包括Number本身)。
  • 类型传递性:如果AB的子类,List<A>List<? extends B>的子类型。

4. 与super通配符的对比

  • extends通配符(? extends T):限定类型上限(必须是T或其子类),用于读取
  • super通配符(? super T):限定类型下限(必须是T或其父类),用于写入
    示例
    // 写入场景用super:
    public static void addNumber(List<? super Integer> list, Integer num) {list.add(num);  // 合法,因为list元素类型至少是Integer的父类
    }
    

总结

extends通配符是Java泛型中实现类型安全灵活兼容的重要工具:

  • 定义泛型时,用<T extends 上限>限制类型范围,确保类型操作的合法性。
  • 使用泛型时,用? extends 上限允许接收子类类型,同时保证读取操作的安全(但牺牲写入能力)。
    合理使用通配符可以避免类型转换异常,提升代码的复用性和可维护性。
http://www.lryc.cn/news/585523.html

相关文章:

  • netdxf—— CAD c#二次开发之(netDxf 处理 DXF 文件)
  • 和鲸社区深度学习基础训练营2025年关卡2(3)pytorch
  • 利用Claude code,只用文字版系统设计大纲,就能轻松实现系统~
  • 免费应用分发平台的安全漏洞和防护机制是什么?
  • 60 美元玩转 Li-Fi —— 开源 OpenVLC 平台入门(附 BeagleBone Black 驱动简单解析)
  • Windows解决 ping 127.0.0.1 一般故障问题
  • 【Linux网络】深入理解HTTP/HTTPS协议:原理、实现与加密机制全面解析
  • 信号量机制
  • 聊聊AI大模型的上下文工程(Context Engineering)
  • Spring 声明式事务:从原理到实现的完整解析
  • 运行ssh -T git@github.com报错
  • 多端协作白板:如何改变传统会议模式!
  • 设计模式 - 面向对象原则:SOLID最佳实践
  • 多态 使用场景
  • 【三维重建工具】NeRFStudio、3D GaussianSplatting、Colmap安装与使用指南
  • VOB如何转换成MP4格式?3种快速转换教程推荐
  • GT IP核仿真测试
  • Kubernetes 高级调度特性
  • 基于kafka的分布式日志收集与实时监控平台(原理,框架)
  • Spring MVC中异常处理
  • unity VR linerenderer的线会被UI盖住
  • 博客系统开发全流程解析(前端+后端+数据库)与 AI 协作初体验
  • [electron]升级功能
  • Android 12系统源码_分屏模式(一)从最近任务触发分屏模式
  • 有限状态机FSM(Finite State Machine)自动初始化
  • 提升你的AI交互技能:使用Anthropic互动提示教程
  • 2025年亚太中文赛B题第一版本超详细解题思路
  • CMU15445-2024fall-project1踩坑经历
  • 学弟让我帮忙写一个学生管理系统的后端,我直接上科技
  • 【八股消消乐】浅尝Kafka性能优化