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

简介: 【5月更文挑战第19天】Java中的泛型通配符用于增强方法参数和变量的灵活性。通配符上限`? extends T`允许读取`T`或其子类型的列表,而通配符下限`? super T`允许向`T`或其父类型的列表写入。野蛮类型不指定泛型,可能引发运行时异常。注意,不能创建泛型通配符实例,也无法同时指定上下限。理解和适度使用这些概念能提升代码的通用性和安全性,但也需兼顾可读性。

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

  1. 通配符上限(Upper Bounds)

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

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

    • 概念:不使用泛型或者使用泛型但不指定类型参数,如List而不是List<String>
    • 示例
   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时要权衡通用性和清晰度。

目录
相关文章
|
安全 Java 开发者
Java 泛型中的通配符 T,E,K,V,?有去搞清楚吗?
本文介绍了Java泛型及其通配符的使用方法与作用。泛型是JDK5引入的特性,提供编译时类型安全检测,避免运行时类型转换异常。文中详细解析了常见通配符T、E、K、V、?的含义及应用场景,如无界通配符`&lt;?&gt;`、上界通配符`&lt;? extends T&gt;`和下界通配符`&lt;? super T&gt;`。通过代码示例,展示了泛型在类型安全、消除强制转换、代码复用和增强可读性等方面的优势。最后强调深入理解技术原理的重要性,以提升开发能力。
478 0
|
安全 Java
Java 泛型上限和下限
Java 泛型上限和下限
|
Java API 容器
Java泛型的继承和通配符
Java泛型的继承和通配符
150 1
|
Java 编译器
[java进阶]——泛型类、泛型方法、泛型接口、泛型的通配符
[java进阶]——泛型类、泛型方法、泛型接口、泛型的通配符
221 0
|
Python Java Go
Java每日一练(20230416) 三数之和、基本计算器、通配符匹配
Java每日一练(20230416) 三数之和、基本计算器、通配符匹配
222 0
Java每日一练(20230416) 三数之和、基本计算器、通配符匹配
|
Java Go
【Java 泛型方法】泛型方法的定义和使用,泛型的通配符和泛型的上下限,泛型的注意事项
【Java 泛型方法】泛型方法的定义和使用,泛型的通配符和泛型的上下限,泛型的注意事项
171 0
java202303java学习笔记第三十一天泛型通配符和综合练习1
java202303java学习笔记第三十一天泛型通配符和综合练习1
129 0
java202303java学习笔记第三十一天泛型通配符和综合练习1
java202303java学习笔记第三十一天泛型通配符和综合练习1
133 0
java202303java学习笔记第三十一天泛型通配符和综合练习4
java202303java学习笔记第三十一天泛型通配符和综合练习4
178 0
java202303java学习笔记第三十一天泛型通配符和综合练习2
java202303java学习笔记第三十一天泛型通配符和综合练习2
97 0