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泛型通配符上界和下界内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

相关文章

  • SpringBoot深入刨析数据层技术

    SpringBoot深入刨析数据层技术

    这篇文章主要介绍了SpringBoot数据层技术的解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • Java中转换器设计模式深入讲解

    Java中转换器设计模式深入讲解

    这篇文章主要给大家介绍了关于Java中转换器设计模式的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Java具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-04-04
  • 一文让你彻底学会Java之BigInteger类常用操作

    一文让你彻底学会Java之BigInteger类常用操作

    这篇文章主要介绍了Java之BigInteger类常用操作的相关资料,BigInteger是Java中用于表示任意精度整数的类,解决了基本数据类型精度限制问题,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-04-04
  • java中Struts2文件上传问题详解

    java中Struts2文件上传问题详解

    文件上传和文件下载是我们在web应用程序中常用的两个功能,在java中,实现这两种功能的方式也有很多种,其中struts2就给我们提供了一种算是比较简单的方式吧,下面我们就一起来看一下,
    2015-07-07
  • Java中反射reflect的基础知识讲解

    Java中反射reflect的基础知识讲解

    这篇文章主要介绍了Java中反射reflect的基础知识讲解,Java中的反射,它算是Java当中非常底层的一个技术,平时我们我们用得不多,实际上它也的确非常复杂同时也难以理解,但是涉及到底层的东西Java都给我们封装好了,我们直接拿来调用即可,需要的朋友可以参考下
    2023-10-10
  • 如何在Spring Boot项目中集成MQTT协议

    如何在Spring Boot项目中集成MQTT协议

    本文介绍在SpringBoot中集成MQTT的步骤,包括安装Broker、添加Eclipse Paho依赖、配置连接参数、实现消息发布订阅、测试接口及注意事项,如唯一客户端ID、安全措施等,帮助开发者快速实现物联网通信,感兴趣的朋友一起看看吧
    2025-06-06
  • Java对象比较之equals与hashCode详解

    Java对象比较之equals与hashCode详解

    这篇文章主要介绍了Java对象比较之equals与hashCode详解,equals 方法和 hashCode 方法是 Object 类中的两个基础方法,它们共同协作来判断两个对象是否相等,需要的朋友可以参考下
    2023-12-12
  • Java static关键字详细介绍与用法总结

    Java static关键字详细介绍与用法总结

    这篇文章主要介绍了Java中static关键字的作用和用法详细介绍,主要讲了静态方法、静态变量、静态类、static和final一块用等内容。需要的朋友可以参考下
    2017-04-04
  • springboot项目关闭swagger如何防止漏洞扫描

    springboot项目关闭swagger如何防止漏洞扫描

    这篇文章主要介绍了springboot项目关闭swagger如何防止漏洞扫描,本文通过示例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2024-05-05
  • windows上nacos自启动的三种方法小结

    windows上nacos自启动的三种方法小结

    本文主要给大家介绍了windows上nacos自启动的三种方法,借助WinSW.exe添加到服务列表,修改nacos启动配置以及以开机"启动"方式——启动Nacos的startup.cmd这三种方法,文中通过图文讲解的非常详细,需要的朋友可以参考下
    2023-12-12

最新评论