JAVA泛型通配符的上界和下界的具体使用

 更新时间:2025年06月30日 10:00:37   作者:不穿铠甲的穿山甲  
本文主要介绍了JAVA泛型通配符的上界和下界的具体使用,上界?extends T适合读操作,下界?super T适合写操作,具有一定的参考价值,感兴趣的可以了解一下

在 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 原则,可以更安全地使用泛型集合。

到此这篇关于JAVA泛型通配符的上界和下界的具体使用的文章就介绍到这了,更多相关JAVA泛型通配符上界和下界内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

相关文章

  • IDEA Maven依赖下载总是失败的几种解决方法

    IDEA Maven依赖下载总是失败的几种解决方法

    我们本地使用 IDEA 运行 maven 项目的时候,有时候运气不好,就会遇到某些 maven 依赖无法正常找到、导入,这就会导致 IDEA 构建项目的时候爆出一堆醒目的红色 Error,今天给大家分享IDEA Maven依赖下载总是失败的几种解决方法,感兴趣的朋友一起看看吧
    2023-09-09
  • Java设计模式系列之深入浅出单例模式

    Java设计模式系列之深入浅出单例模式

    设计模式是在大量的实践中总结和理论之后优选的代码结构,编程风格,以及解决问题的思考方式,下面这篇文章主要给大家介绍了关于Java设计模式系列之深入浅出单例模式的相关资料,需要的朋友可以参考下
    2021-09-09
  • java使用缓冲流复制文件的方法

    java使用缓冲流复制文件的方法

    这篇文章主要为大家详细介绍了java使用缓冲流复制文件的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-08-08
  • 一文带你深入了解Java的自动拆装箱

    一文带你深入了解Java的自动拆装箱

    Java推出了对于基本数据类型的对应的对象,将基本数据类型转换为对象就称为装箱,反之则是拆箱,本文主要为大家介绍了Java自动拆装箱的原理与应用,需要的可以参考下
    2023-11-11
  • Java实现的各种排序算法(插入排序、选择排序算法、冒泡排序算法)

    Java实现的各种排序算法(插入排序、选择排序算法、冒泡排序算法)

    本文是小编给大家带来的java各种排序算法知识,包括插入排序、选择排序算法、冒泡排序算法,代码简单易懂,需要的朋友可以参考下
    2016-08-08
  • 将ResultSet中得到的一行或多行结果集封装成对象的实例

    将ResultSet中得到的一行或多行结果集封装成对象的实例

    这篇文章主要介绍了将ResultSet中得到的一行或多行结果集封装成对象的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-05-05
  • java springboot的概述、特点与构建介绍

    java springboot的概述、特点与构建介绍

    大家好,本篇文章主要讲的是springboot的概述、特点与构建介绍,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2021-12-12
  • Spring中@Component和@Bean的深度对比解析

    Spring中@Component和@Bean的深度对比解析

    在Spring框架中,@Component和@Bean都是实现依赖注入的核心注解,但它们的应用场景和实现机制存在显著差异,本文将通过代码示例和原理拆解,深入探讨二者的区别,感兴趣的朋友一起看看吧
    2025-06-06
  • springboot利用AOP完成日志统计的详细步骤

    springboot利用AOP完成日志统计的详细步骤

    项目用到了过滤器,可能有的人会不理解,之所以用过滤器是因为想要在日志记录post请求的json数据。本文重点给大家介绍springboot利用AOP完成日志统计的详细步骤,感兴趣的朋友跟随小编一起看看吧
    2021-12-12
  • SpringMVC 重定向参数RedirectAttributes实例

    SpringMVC 重定向参数RedirectAttributes实例

    这篇文章主要介绍了SpringMVC 重定向参数RedirectAttributes实例,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12

最新评论