super T 和? extends T区别

深入解析Java泛型上下界:extends与super的精妙应用 本文深入探讨了Java泛型编程中的上下界约束,即`extends`和`super`关键字的运用。通过实际案例,我们学习了如何利用这两个关键字来定义泛型类型参数的继承范围,从而实现更灵活和安全的代码编写。同时,我们也了解到了泛型上下界的局限性,以及如何在实际编程中做出更合适的选择。掌握泛型上下界,可以提高代码的可读性和可维护性,写出既安全又高效的代码。 阅读详情
 

Java 泛型

关键字说明

  • ? 通配符类型
  • <? extends T> 表示类型的上界,表示参数化类型的可能是T 或是 T的子类
  • <? super T> 表示类型下界(Java Core中叫超类型限定),表示参数化类型是此类型的超类型(父类型),直至Object

extends 示例

static class Food{}
static class Fruit extends Food{}
static class Apple extends Fruit{}
static class RedApple extends Apple{}

List<? extends Fruit> flist = new ArrayList<Apple>();
// complie error:
// flist.add(new Apple());
// flist.add(new Fruit());
// flist.add(new Object());
flist.add(null); // only work for null 

List<? extends Frut> 表示 “具有任何从Fruit继承类型的列表”,编译器无法确定List所持有的类型,所以无法安全的向其中添加对象。可以添加null,因为null 可以表示任何类型。所以List 的add 方法不能添加任何有意义的元素,但是可以接受现有的子类型List<Apple> 赋值。

Fruit fruit = flist.get(0);
Apple apple = (Apple)flist.get(0);

由于,其中放置是从Fruit中继承的类型,所以可以安全地取出Fruit类型。

flist.contains(new Fruit());
flist.contains(new Apple());

在使用Collection中的contains 方法时,接受Object 参数类型,可以不涉及任何通配符,编译器也允许这么调用。

super 示例

List<? super Fruit> flist = new ArrayList<Fruit>();
flist.add(new Fruit());
flist.add(new Apple());
flist.add(new RedApple());

// compile error:
List<? super Fruit> flist = new ArrayList<Apple>();

List<? super Fruit> 表示“具有任何Fruit超类型的列表”,列表的类型至少是一个 Fruit 类型,因此可以安全的向其中添加Fruit 及其子类型。由于List<? super Fruit>中的类型可能是任何Fruit 的超类型,无法赋值为Fruit的子类型Apple的List<Apple>.

// compile error:
Fruit item = flist.get(0);

因为,List<? super Fruit>中的类型可能是任何Fruit 的超类型,所以编译器无法确定get返回的对象类型是Fruit,还是Fruit的父类Food 或 Object.

小结

extends 可用于的返回类型限定,不能用于参数类型限定。
super 可用于参数类型限定,不能用于返回类型限定。
>带有super超类型限定的通配符可以向泛型对易用写入,带有extends子类型限定的通配符可以向泛型对象读取。——《Core Java》

 

List<? extends T>和List<? super T>之间的区别 定义几个基础类 // 动物类,一个吃方法 public static class Animal { public void eat() { System.out.println("Animal eat"); } } // 鸟继承自动物,一个飞方法 public static class Birds extends Animal { public void fly() { System.out.prin 阅读详情

相关推荐

Tomcat启动过程中cmd窗口(控制台)中文乱码的问题

tomcat启动时,启动过程日志中文乱码的处理方法。

寻码启示 1942

Java泛型通配符extends与super

关键字说明 ●  ? 通配符类型 ●  &lt;? extends T&gt; 表示类型的上界,表示参数化类型的可能是T 或是 T的子类 ●  &lt;? super T&gt; 表示类型下界(Java Core中叫超类型限定),表示参数化类型是此类型的超类型(父类型),直至Object extends 示例 static class Food{} static class Fruit...

weixin_34014555的博客 342

单细胞转录组分析(scRNA-seq)

单细胞转录组测序(Single-cell RNA sequencing,scRNA-seq)是一种高通量测序技术,可以在单细胞水平解析基因表达情况,揭示细胞异质性,探索稀有细胞类型,并研究细胞状态转换及动态调控机制。与传统的。

大甘的博客 6147

Java 泛型 ? extends 与 ? super

我们经常在集合的泛型中用到 extends、super 关键字。先看下 List 集合中获取和放入接口的定义: 通过类定义可以看到,泛型的具体类型在创建集合实例时指定,用于限定该实例的 get/set 取出和放入时的集合元素类型。了解上述后,再看下面你就不会觉得奇怪。 第一条语句编译错误,为什么呢?第二条语句正常编译,为什么呢? 第一条语句编译正常,为什么呢?第二条语句正常编译,为什么呢?在上面的例子中,我们至少能看出:我们用 Java 对现实世界的水果进行简单的抽象,水果抽象为 Fruit,Apple

ikun 的博客 1万+

《R语言实战》第八章之回归分析图形

回归分析图形 回归分析分为简单回归与复杂回归 1 : 简单线性回归即:模型中只包含一个因变量和一个自变量,有时候也会包含多项式, 这个图形描述了身高与体重的线性关系,这也是一个多项式图形 2:当我们的预测变量(自变量)不止一个时,就属于多元线性回归,而且多元线性回归中也可以包含多项式以及交互项 (1)在进行多远回归分析之前可以先描述变量之间的相关关系 上图为一个散点图矩阵,描述了五个变量之间的相关关系,我们可以通过非主对角线的散点图来查看两个变量之间的关系。 多元线性回归简单地就是OLS回归,通过lm和

Strawberry_Ya的博客 1833

激光雷达接收芯片选型指南:APD、SiPM、SPAD阵列的优缺点对比

本文深入对比了激光雷达接收芯片APD、SiPM和SPAD阵列的核心技术原理与性能差异。APD作为线性模式工作的稳健选择,动态范围大;SiPM具备单光子探测和高增益优势;而SPAD阵列凭借像素级数字读出和集成TDC,在时间分辨率与系统集成度上领先。文章从灵敏度、时间精度、动态范围及系统成本等多维度剖析,为不同应用场景(如车载雷达、Flash LiDAR、消费电子)的芯片选型提供实战指南。

ik6789012的博客 655

【Java】泛型中extends和super的理解

是用来限制泛型类型参数的上限和下限的关键字。它们可以在定义泛型类、泛型方法、泛型接口时使用。关键字用于限制泛型类型参数的上限,表示该泛型类型参数必须是指定类型或指定类型的子类。关键字用于限制泛型类型参数的下限,表示该泛型类型参数必须是指定类型或指定类型的父类。关键字的作用是限制泛型类型参数的范围,使得泛型类型参数在使用时更加安全和可靠。这样定义后,如果我们创建这个泛型类的实例时,这样定义后,如果我们创建这个泛型类的实例时,

helloxiefei的博客 2802

5G移动性管理实战:手把手教你配置NR小区重选参数(附避坑指南)

本文深入解析5G网络移动性管理中的小区重选参数配置实战。通过拆解小区选择与重选的核心机制,结合真实案例,手把手指导如何配置NR小区重选参数,并分享常见避坑指南,帮助工程师优化网络性能,提升用户移动体验。

weixin_29229261的博客 197

Java泛型中的extend 和 super

extends:用于指定类型参数的上界,通常用于生产者(只读)的场景。super:用于指定类型参数的下界,通常用于消费者(只写)的场景。PECS 原则:Producer Extends, Consumer Super,指导何时使用extends和super。通过理解和正确使用extends和super,可以编写出类型安全且灵活的泛型代码,满足各种不同的需求。

青衫客36的博客 1506

保姆级CVE-2018-17066漏洞复现 DLink命令注入漏洞(更新完结)

之后按照之前复现的方式一样 我们丢到kali中执行binwalk解析。之后为了模拟 可以在kali里安装qemu-mipsel。在bin目录下可以尝试将goahead的环境搭配好。固件官网可以进行下载。

weixin_51339377的博客 878

IQA图像质量评价 数据集介绍(LIVE、TID2013、CSIQ、LIVEC、KonIQ-10K)

LIVE、TID2013、CSIQ、LIVEC、KonIQ-10K 数据集介绍

qq_37925923的博客 1万+

Java :T extends Comparable<? super T> 和 T extends Comparable<T>的区别

《Java泛型函数比较:T extends Comparable<T> vs T extends Comparable<? super T>》 摘要:本文对比了两个Java泛型函数的区别,主要在于类型参数的不同约束。T extends Comparable<T>要求类型T必须直接实现与自身比较,而T extends Comparable<? super T>允许T与自身或其父类比较,兼容继承场景。后者适用范围更广,能处理子类复用父类比较逻辑的情况,如Dog继承

weiweiliude2的专栏 553

linux操作系统使用以太网连接ubuntu,设置固定ipv4

首先,您需要确定要配置的网络接口。可以使用ifconfig -a或ip addr命令来列出当前系统上的所有网络接口及其相关信息。找到您要配置的网络接口名称,例如eth0、ens33或enp0s3;保存并关闭文件后,您需要重启网络服务以使更改生效。在linux操作系统中,要使用交换机连接以太网可以直接使用交互界面;如果你的操作系统没有交互界面,你可以使用命令方式配置;点击ipv4,方式为手动,可以设置ip和子网了;开头,后接网络接口名称。第三步:点击有线最右边圆形控件;第二步:点击有线设置;

2301_79311842的博客 2403

List<? extends T>与List<? super T>的区别

(1)List<?extends T>适用于读取数据,读取出来的数据全部用T类型接收。如果我们往此 list 中添加 T 类型不同的子类的话,各种子类无法相互转换,因此不能添加元素,但可接受初始赋值。(2)List<?super T>适用于添加元素,只能添加 T 类型或其子类类型。因为这些类型都能转换为T的任意超类类型(向上转型),因此我们可以对此 list 添加元素。只能用 Object 类型来接收获取到的元素,但是这些元素原本的类型会丢失。

日常工作记录,解决实际问题,不成体系。 1039

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Java泛型之 ? extends T和 ? super T 的区别

目录 extends和super的介绍 extends规则 super规则 extends和super的介绍 关于Java泛型,这里我不想总结它是什么,这个百度一下一大堆解释,各种java的书籍中也有明确的定义,只要稍微看一下就能很快清楚.从泛型的英文名字Generic type也能看出,Generic普通、一般、通用的,是一个概括性的词,那么泛型从名字上也就好理解了,它是...

newchitu的博客 202

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

【java】泛型中,? extends T 与 ? super T 的区别、看法

1. List<? extends T>和List<? super T>有哪些区别? ①List<? extends T> ,只允许泛型为T及T的子类引用调用。比如: List<? extends Number> list = new ArrayList<Double>; 而List<? super T>,只允许泛型为...

winrh的博客 7188

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

泛型中? super T和? extends T的区别

原文链接 经常发现有List<? super T>、Set<? extends T>的声明,是什么意思呢?<? super T>表示包括T在内的任何T的父类,<? extends T>表示包括T在内的任何T的子类,下面我们详细分析一下两种通配符具体的区别。 extends List<? extends Number> foo3的通配符声明,意味着以下的赋值是合法的: // Number "extends" Number (in th.

八荒六合唯我独尊 319

extends的含义java_java中的通配符 ? extends T 和 ? super T 的区别

意义不同? extends T 表示上界是T? super T 表示下界是T用法不同以List为例List extends T> 表示List中存放的都是T或者T的子类型List extends Number> foo = new ArrayList();List extends Number> foo = new ArrayList();List extends Number&...

weixin_35715440的博客 335

java List<? extends T>和List<? super T>使用区别

java List<? extends T>和List<? super T>使用区别

weixin_43270731的博客 1454

java 返回 extends t_Java 泛型中? super T和? extends T的区别

经常发现有List super T>、Set extends T>的声明,是什么意思呢? super T>表示包括T在内的任何T的父类, extends T>表示包括T在内的任何T的子类,下面我们详细分析一下两种通配符具体的区别。extendsList extends Number> foo3的通配符声明,意味着以下的赋值是合法的://Number"extends...

weixin_30313365的博客 162

?extends T 和? super T 的区别

&lt;? extends T&gt; &lt;? extends T&gt;表示类型的上界,也就是说参数化的类型 可能是T或是T的子类。 例如下面的写法都是合法的赋值语句: List&lt;? extends Number&gt;list=new ArrayList&lt;Number&gt;(); //Integer是Number的子类 List&lt;? extends Number...

Marmara 3908

java t super extends_泛型中? super T和? extends T的区别

原文链接 李璟(jlee381344197@gmail.com)经常发现有List super T>、Set extends T>的声明,是什么意思呢? super T>表示包括T在内的任何T的父类, extends T>表示包括T在内的任何T的子类,下面我们详细分析一下两种通配符具体的区别。extendsList extends Number> f...

weixin_39789094的博客 87

?super T 和? extends T区别

Java 泛型 关键字说明 ? 通配符类型 <? extends T> 表示类型的上界,表示参数化类型的可能是T 或是 T的子类 <? super T> 表示类型下界(Java Core中叫超类型限定),表示参数化类型是此类型的超类型(父类型),直...

231

嵌入式C代码风格自动化:用Cursor Rules打造可复用检查方案

代码风格检查是嵌入式C开发中保障可维护性与团队协作效率的关键环节。其核心原理在于将编码规范转化为机器可读的规则,通过静态检查与上下文感知实现自动化约束。在嵌入式场景下,这能显著降低硬件相关代码的容错风险,提升跨平台移植的稳定性。典型应用包括中断安全、volatile使用、寄存器访问等专项检查。Cursor Rules机制为嵌入式C项目提供了一种可落地的风格自动化方案,结合Pikachu项目实战,可有效统一代码风格并规避常见陷阱。

weixin_34221773的博客 420
上一篇: IOS开发之格式化日期时间
下一篇: Objective-C Runtime
focusjava
博客等级 码龄14年 127粉丝 528原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值