Java一分钟之-泛型通配符:上限与下限野蛮类型

在Java中,泛型通配符允许我们在定义方法参数或变量时,接受不同类型的泛型实例。了解通配符的上限和下限,以及野蛮类型,有助于编写更具通用性的代码。以下是一些关键概念、常见问题及其解决方案,以及代码示例。

  1. 通配符上限(Upper Bounds)

    • 概念 :使用? extends T表示类型是T或其子类型。T被称为上限类型。
    • 示例
java 复制代码
   void addToList(List<? extends Number> numbers) {
       numbers.add(10); // 错误,不能添加元素
       Number num = numbers.get(0); // 正确,可以安全地读取
   }
  • 问题:只能读取,不能添加元素。
  • 避免:使用通配符上限时,明确代码的读写需求。
  1. 通配符下限(Lower Bounds)

    • 概念 :使用? super T表示类型是T或其父类型。T被称为下限类型。
    • 示例
java 复制代码
   void copyNumbers(List<? super Number> dest, List<Number> src) {
       dest.addAll(src); // 正确,可以添加元素
       Number num = dest.get(0); // 错误,编译错误,无法安全地读取
   }
  • 问题:只能添加元素,不能安全地读取元素。
  • 避免:使用通配符下限时,确保代码主要关注写入操作。
  1. 野蛮类型(Raw Types)

    • 概念 :不使用泛型或者使用泛型但不指定类型参数,如List而不是List<String>
    • 示例
java 复制代码
   List list = new ArrayList(); // 野蛮类型
   list.add("String"); // 可以添加任何类型
   Object obj = list.get(0); // 获取的是Object类型,需要显式转换
  • 问题:类型安全检查缺失,可能导致运行时ClassCastException。
  • 避免:尽可能避免使用野蛮类型,除非与遗留的非泛型代码交互。
  1. 通配符的限制

    • 问题 :不能创建泛型通配符类型的实例,如List<? extends Number> numbers = new ArrayList<>()是不允许的。
    • 避免 :在需要创建实例时,指定确切的类型,如List<Number> numbers = new ArrayList<Number>()
  2. 边界冲突

    • 问题 :不能同时指定上下限,如? extends Number & Comparable<?>是非法的。
    • 避免:若需同时限制上下边界,可能需要使用自定义接口或类作为边界。

理解并熟练使用泛型通配符的上限、下限和野蛮类型,可以编写出更灵活且类型安全的代码。然而,过度使用通配符可能导致代码可读性降低,因此在设计API时要权衡通用性和清晰度。

相关推荐
majingming1235 小时前
FUNCTION
java·前端·javascript
zopple5 小时前
常见的 Spring 项目目录结构
java·后端·spring
xuxie997 小时前
N11 ARM-irq
java·开发语言
cjy0001117 小时前
springboot的 nacos 配置获取不到导致启动失败及日志不输出问题
java·spring boot·后端
wefly20177 小时前
从使用到原理,深度解析m3u8live.cn—— 基于 HLS.js 的 M3U8 在线播放器实现
java·开发语言·前端·javascript·ecmascript·php·m3u8
zhenxin01227 小时前
Spring Boot实现定时任务
java
小江的记录本8 小时前
【事务】Spring Framework核心——事务管理:ACID特性、隔离级别、传播行为、@Transactional底层原理、失效场景
java·数据库·分布式·后端·sql·spring·面试
sheji34168 小时前
【开题答辩全过程】以 基于springboot的校园失物招领系统为例,包含答辩的问题和答案
java·spring boot·后端
寂静or沉默8 小时前
2026最新Java岗位从P5-P7的成长面试进阶资源分享!
java·开发语言·面试
卓怡学长8 小时前
m289在线交友系统
java·spring·tomcat·maven·intellij-idea·hibernate