通配符<? extends T>和<? super T>区别及使用场景

Java 之泛型通配符 ? extends T 与 ? super T 通配符解惑 ? super T 阅读详情
<? extends T> : 上界通配符(Upper Bounds Wildcards)
<? super T> : 下界通配符(Lower Bounds Wildcards)

平时开发会遇到通配符<? extends T>和<? super T>的用法,比如:Collections类提供的集合元素拷贝的copy()方法就同时使用了<? extends T>和<? super T>。

public class Collections {

	public static <T> void copy(List<? super T> dest, List<? extends T> src) {
        int srcSize = src.size();
        if (srcSize > dest.size())
            throw new IndexOutOfBoundsException("Source does not fit in dest");

        if (srcSize < COPY_THRESHOLD ||
            (src instanceof RandomAccess && dest instanceof RandomAccess)) {
            for (int i=0; i<srcSize; i++)
                dest.set(i, src.get(i));
        } else {
            ListIterator<? super T> di=dest.listIterator();
            ListIterator<? extends T> si=src.listIterator();
            for (int i=0; i<srcSize; i++) {
                di.next();
                di.set(si.next());
            }
        }
    }

}

baomidou的分页查询page()方法使用了<? extends T>:

<E extends IPage<T>> E page(E page, Wrapper<T> queryWrapper);

但为什么要这么用?如果我们使用的话可以用在哪些场景?下面我们通过小示例来理解它的作用和使用场景。


我们发现,类的继承关系能做到对子类型的兼容,但泛型没办法对子类型兼容,编译期就会报错。
在这里插入图片描述

在这里插入图片描述
解决编译错误,可以使用到通配符,满足泛型对子类型的兼容。
在这里插入图片描述
除了<? extends T> 用法,还有另一种用法<? super T>。下面我们来看看他们的区别。

声明包含上下界通配符的集合类型:
在这里插入图片描述
使包含上下界通配符的集合类型:
<? extends Number>

  • add() : 编译器只知道元素类型是 Number 或 Number 的子类,所以有可能是 Number、Integer、Long、Float、Double其中一个类型,为保证类型安全不能添加除了 null 以外的任何元素,即使是 Number 本身也不行。
  • get() : 既然编译器不知道此时集合中的元素是 Integer、Long、Float、Double 的哪一个,返回类型只能是他们共同父类 Number 类型。

<? super Number>

  • add() : 编译器只知道元素类型是 Number 或Number 的父类,所以有可能是Number、Object其中一个。编译器知道下界是 Number ,根据类型向上兼容所以可以添加的元素是 Number 以及 Number 的子类。
  • get() : 既然编译器不确定集合类型是 Number 或Number父类的哪一种类型,add()的又是哪类型,返回类型只能是他们的共同父类 Object 。
    在这里插入图片描述
    特点:<? extends T> 的 add() 被限制,<? super T> 的 get() 被限制。

所以,<? extends T> 上界通配符,被设计为用来读取数据的泛型(只能读取数据为T的元素);<? super T> 下界通配符,被设计为用来写数据的泛型(只能写入T或T的子类型)。

回头看看文章开头提到的两个使用场景,是不是就明白了。



示例源码:

public static void main(String[] args) {

        /**
         * 上界通配符,通配符?只能是 T 和 T 的子类
         * add(): 不可以加入任何元素,除了null
         * get():返回的值的类型默认是T
         */
        ArrayList<? extends Number> list1 = new ArrayList<Integer>(); //子类
        list1.add(1);    //编辑报错,因为通配符?可能是T或T的子类
        list1.add(null); //null可以,因为null可以为任何类型,但无意义

        Number number = list1.get(0); //默认是T类型,从声明泛型集合时我们知道,可以声明T和T的子类任何一个,所以返回默认只能是T,如果是子类再强转
        Integer integer = (Integer) list1.get(0); //可以强转成子类型,但如果不是Integer会包运行错误java.lang.ClassCastException

        /**
         * 下界通配符,通配符?只能是 T 和 T 的父类
         * add(): 只能添加类型为 T 和 T 的子类
         * get():返回的值默认是 Object类型
         */
        ArrayList<? super Number> list2 = new ArrayList<Number>();
        list2.add(1);
        list2.add(1L);
        list2.add(1.1f);
        list2.add(2.5d);

        Object object = list2.get(0); //默认是Object类型,因为在add()时可以是T和T的子类,所以返回默认是Object
}
Java泛型通配符彻底讲透:? extends与? super的读写边界与PECS原则 泛型是Java语言实现类型安全的核心机制,而通配符(?)则是平衡类型安全与API灵活性的关键。许多开发者对List<?>、List<? extends T>、List<? super T>的区别感到困惑,尤其是数据读写边界和PECS原则的应用。本文从泛型不变性原理出发,解析无界通配符、上界通配符和下界通配符的适用场景,并通过Comparable<? super T>这类比较大小的经典签名,说明通配符在排序、求极值等工程实践中的正确用法。同时澄清Java泛型通配符与Linux、Word通配符的本质差异,帮助读 阅读详情

相关推荐

Java 泛型使用通配符

ArrayList<?泛型,JDK1.5新加入的,解决数据类型的安全性问题,其主要原理是在类声明时通过一个标识表示类中某个属性的类型或者是某个方法的返回值及参数类型。使用泛型时,泛型类型必须为引用数据类型,不能为基本数据类型,Java中的普通方法,构造方法,静态方法中都可以使用泛型,方法使用泛型之前必须先对泛型进行声明,可以使用任意字母,一般都要大写。在引入范型之前,要在类中的方法支持多个数据类型,就需要对方法进行重载,在引入范型后,可以解决此问题(多态),更进一步可以定义多个参数以及返回值之间的关系。

usertest1的博客 1066

Java的<? super T>和<? extends R>理解与应用

记录:293 场景:Java的 ? super T 和? extends R 理解与应用。? super T:表示?匹配的类型都是T的父类,包括T本身。? extends R:表示?匹配的类型都是类型R的子类,包括R本身。

zhangbeizhen18的博客 5841

用 SQL-based scalar function 把复杂算法下沉到 SAP HANA:CDS、AMDP 与可复用计算组件实践

摘要:SQL-based scalar function 是 SAP S/4HANA 项目中解决业务算法重复实现问题的有效方案。它能将标量计算逻辑封装为可复用的数据库函数,支持 CDS view、RAP BO 和 ABAP SQL 调用,确保计算口径统一并实现天然下推。该方案通过定义(CDS scalar function)、绑定(implementation reference)和实现(AMDP SQLScript)三个对象协同工作,特别适合处理带业务规则的复杂计算(如毛利率、占用率等)。典型应用场景可减

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1697

理解Java泛型的复杂写法<? super T>,<? extend T>

“

进击的豌豆的博客 2872

CorelDRAW 2019安装指南:从下载到激活的完整步骤

本文提供了一份详细的CorelDRAW 2019安装指南,涵盖从下载安装包、检查系统环境到完成激活的完整步骤。文章重点解析了安装过程中的关键选项设置,并分享了首次启动后的优化配置与常见问题解决方案,旨在帮助用户高效、顺利地完成这款经典矢量设计软件的安装与配置。

weixin_29213827的博客 833

SD - WAN:企业出海的网络加速器

例如,一家中国的跨境电商企业,在欧美市场的促销活动期间,借助 SD - WAN 技术,即使面对海量订单数据的交互,也能确保欧美客户在浏览商品、下单支付时感受到近乎本地网络的流畅体验,大大提升了客户满意度,稳住了销售增速。企业无需在海外本地部署大量冗余服务器,只需依托云台,借助 SD - WAN 快速稳定的网络连接,即可轻松实现业务拓展,进一步精简运营架构,提升整体效能。在未来,随着技术的不断演进和企业出海需求的持续增长,SD - WAN 将持续赋能,助力更多企业在全球市场扬帆远航,书写辉煌篇章。

idcicp_com的博客 446

聊聊<? extends T>和<? super T>的含义及区别

extends T>和super T>是Java泛型中的“通配符(Wildcards)”和“边界(Bounds)”的概念。extends T > //是指 “上界通配符(Upper Bounds Wildcards)”

Code Writers 518

ROS-Industrial :simple_message

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录1. 概述2. 协议(Protocol)3. HEADER解析3.1 MSG_TYPE3.2 COMM_TYPE3.3 REPLY CODE 1. 概述 Simple_Message是ROS-Industrial的一部分,定义了用于与工业机器人控制器通信的简单消息连接协议。另外还包括处理连接受限系统的处理器和管理器类。 2. 协议(Protocol) 简单消息(simplemessage)协议定义了ROS的驱动层和机器人控制器之.

flsxyw的博客 780

<? extends T>和<? super T>理解与使用

在 Java 泛型中,?extends T 和?super T 是两种通配符,用于限制类型参数的范围。这两种通配符分别代表上界通配符(Upper Bounded Wildcard)和下界通配符(Lower Bounded Wildcard)。

qq_41276800的博客 1370

OpenWrt kmod内核不兼容?手把手教你用脚本强制安装驱动模块(附国内镜像源)

本文详细解决了OpenWrt kmod内核不兼容问题,提供智能脚本强制安装驱动模块的方法,并附有国内镜像源加速配置。通过自动化脚本修改内核MD5校验值,确保kmod包正常安装,同时推荐多个国内镜像源以提升下载速度。

weixin_42549451的博客 542

TGRS 2026 即插即用 | 注意力篇 | SCFM:双向交叉显著性引导注意力,高层语义与低层细节的双向互补!

本文介绍了MPCNet中的语义引导交叉注意力融合模块(SCFM),该模块通过双向交叉显著性引导机制实现跨尺度特征融合。SCFM创新性地结合了高层语义和低层细节的互补信息,通过轻量局部空间注意力预增强和坐标注意力全局融合引导,显著提升了红外小目标检测的精度。实验表明,SCFM在多个数据集上达到SOTA性能,同时保持轻量高效的计算特性,支持端侧设备部署。 SCFM的核心贡献包括: 双向交叉显著性引导机制,实现语义与细节的互补融合 轻量局部空间注意力预增强模块,计算量仅为传统方法的1/10 坐标注意力全局融合引导

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 147

泛型中的通配符<?>、<? extends T>、<? super T>的使用场景。ArrayList与LinkedList的区别及适用场景。

用于不关心具体泛型类型的情况,增加灵活性。extends T>:用于读取数据,确保能接收T的子类,常用于方法返回类型限定。super T>:用于写入数据,确保能添加T类型及其子类的对象,常用于方法参数类型限定。这些通配符的使用场景和规则,使得Java的泛型编程更加灵活和强大,同时也保证了类型安全。ArrayList与LinkedList的区别及适用场景。ArrayList与LinkedList在Java集合框架中都是常用的List实现类,它们之间存在明显的区别,这些区别决定了它们各自适用的场景。

weixin_53180424的博客 1286

车牌识别系统

随这图形图像技术的发展,现在的车牌识别技术准确率越来越高,识别速度越来越快。无论何种形式的车牌识别系统,它们都是由触发、图像采集、图像识别模块、辅助光源和通信模块组成的。车牌识别系统涉及光学、电器、电子控制、数字图像处理、计算视觉、人工智能等多项技术。触发模块负责在车辆到达合适位置时,给出触发信号,控制抓拍。辅助光源提供辅助照明,保证系统在不同的光照条件下都能拍摄到高质量的图像。图像预处理程序对抓拍的图像进行处理,去除噪声,并进行参数调整。然后通过车牌定位、字符识别,最后将识别结果输出。 牌照自动识别是一

FPGA/MATLAB学习教程/源码/项目合作开发 2万+

Java基础: 泛型 <? super T> 中 super与extends的理解

文章结合知乎大佬的回答,结合自己的理解进行整理.但主题属于该作者. 原文链接: 点击跳转

微不足道的博客 2203

MinerU在线API异步调用代码开发示例

本文展示了如何使用Python异步编程调用MinerU在线API进行文件批量上传。代码示例包含三个主要功能:1) 通过API密钥获取文件上传URL;2) 使用信号量控制并发上传多个文件;3) 获取提取结果。实现采用httpx异步客户端和asyncio库,支持文件存在性检查、错误处理和日志记录。示例中演示了如何上传PDF文件到MinerU平台,并提供了获取批量处理结果的接口。该代码可作为异步调用MinerU API的参考实现。

拥抱具身智能,昇腾Ascend C 352

YOLOv11改进 | 模型知识蒸馏篇 | 利用模型蒸馏改进YOLOv11进行无损涨点 | 在线蒸馏 (附代码 + 完整文件 + 解析教程)

这篇文章给大家带来的最新改进是模型的蒸馏,利用教师模型指导学生模型从而进行模型的涨点,本文的内容不仅可以用于论文中,在目前的绝大多数的工作中模型蒸馏是一项非常重要的技术,所以大家可以仔细学习一下本文的内容,本文从YOLOv11的项目文件为例,进行详细的修改教程,文章内包括完整的修改教程,针对小白我出了视频修改教程,如果你还不会我提供了修改后的文件大家直接运行即可,所以说不用担心不会适用!模型蒸馏真正的无损涨点,蒸馏你只看这一篇文章就足够了,本文内容为在线蒸馏教程,之前的文章为离线蒸馏!

Snu77的博客 2667

Java中 ? extends T 和 ? super T 的理解

? 通配符类型- <? extends T> 表示类型的上界,表示参数化类型的可能是T 或是 T的子类; <? super T> 表示类型下界(Java Core中叫超类型限定),表示参数化类型是此类型的超类型(父类型),直至Object;extends比如,我们现在定义:List<? extends T>首先你很容易误解它为继承于T的所有类的集合,你可能认为,你定义的这个List可以用来put任何

Dream It Possible 3万+

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

【Java】extends和super泛型限定符

请解释extends 和super 泛型限定符-上界不存下界不取 extends上限通配符,用来限制类型的上限,只能传入本类和子类,add方法受阻,可以从一个数据类型里获取数据; super下限通配符,用来限制类型的下限,只能传入本类和父类,get方法受阻,可以把对象写入一个数据结构里; 在java泛型中,? 表示通配符,代表未知类型,< ? extends Object>表示上边界限...

renjingjingya0429的博客 766

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Java 泛型:通配符详解extends super

在java泛型中,? 表示通配符,代表未知类型,表示上边界限定通配符,表示下边界限定通配符。 通配符与T的区别 T:作用于模板上,用于将数据类型进行参数化,不能用于实例化对象。  ?:在实例化对象的时候,不确定泛型参数的具体类型时,可以使用通配符进行对象定义。 等同于 等同于 例一:定义泛型类,将key,value的数据类型进行参数化,而不可以使用通配符。 public c

Jason丶宇的博客 1046

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Java泛型:T、E、K、V、?,你还在傻傻分不清?

Java泛型通配符使用指南 本文详细介绍了Java泛型中常见的T、E、K、V等类型参数和?通配符的区别与使用场景。首先解释了泛型的必要性:避免类型不安全、减少强制转换和运行时错误。然后分析了各类型参数的含义:T表示任意类型,E用于集合元素,K/V代表键值对。重点讲解了三种通配符用法:无界通配符?处理未知类型,? extends T用于读取数据,? super T适合写入数据。最后提出了PECS原则(Producer Extends, Consumer Super),建议根据生产者/消费者角色选择适当的通配符

xh2277659985的博客 480

java 泛型通配符和边界

1. 通配符 泛型中常用的通配符: 我们在定义泛型类,泛型方法,泛型接口的时候经常会碰见很多不同的通配符,比如 T,E,K,V ,?等等,这些通配符又都是什么意思呢? ? 表示不确定的 java 类型 T (type) 表示具体的一个java类型 K V (key value) 分别代表java键值中的Key Value E (element) 代表Element 比如在不确定泛型参数的具体类型时,可以使用?代替,比如下方的例子: 比如public void set(List<?>

zhbi98 的技术 Blogs 1032

Java泛型:通配符详解extends super

在Java泛型中,? 表示通配符,代表未知类型,表示上边界限定通配符,表示下边界限定通配符。 通配符 与 T 的区别 T:作用于模板上,用于将数据类型进行参数化,不能用于实例化对象。 ?:在实例化对象的时候,不确定泛型参数的具体类型时,可以使用通配符进行对象定义。 T > 等同于 T extends Object> 等同于 extends Object> 例一:定义泛型类,将key,

madison's blog 863

Java泛型通配符详解:从? extends到? super的实战指南

Java泛型通过类型参数在编译期保证类型安全,但其不变性使得List<Integer>无法直接传递给List<Number>,给代码复用带来障碍。通配符(?)正是为打破这一限制而生的关键机制,通过上界extends与下界super分别支持协变与逆变,配合PECS原则(Producer Extends, Consumer Super)可精准控制集合的读写边界。理解通配符的语义与捕获转换机制,能够帮助开发者设计出类似Collections.max的通用方法,并在实际项目中优雅处理只读、写入、排序等场景。本文从泛

weixin_33563728的博客 267

原神一面:Java 泛型中的通配符 T,E,K,V,?,你确定都了解吗?

点击上方 "编程技术圈"关注,星标或置顶一起成长后台回复“大礼包”有惊喜礼包!每日英文Sometimes, the same thing, we can go to th...

程序员小乐 335

泛型中的T、E、K、V、?

首先,我们要明确一个概念,T,E,K,V是类型参数(Type Parameter),而?- 类型不安全: 可以存入任何类型(String、Integer等),但取出时容易忘记转换或转换错误 - 繁琐的强制转换: 每次取出都要手动cast - 运行时错误: 如果类型转换错了,只能在运行时才发现(抛出ClassCastException)表示“某种类型是 T 或 T 的子类”,适合生产者/只读场景(PECS 原则中的 Producer)。读(生产者)用 extends,写(消费者)用 super。

mcband的博客 877
上一篇: Java中如何实现String字符串的反转(四种方式实现)
下一篇: IDEA怎么设置Class类注释模板并自动生成
pbxs
博客等级 码龄14年 94粉丝 62原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值