一篇文章带你了解Java泛型的super和extends

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

概念简单理解

  • List<? extends T>表示该集合中存在的都是类型T的子类,包括T自己
  • List<? super T>表示该集合中存的都是类型T的父类,包括T自己

代码样例解读

父子类代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

/**

 * 生物

 */

static class Biological{

}

/**

 * 动物

 */

static class Animal extends Biological{

}

/**

 * 植物

 */

static class Plant extends Biological{

}

static class Dog extends Animal{

}

static class Cat extends Animal{

}

static class Flower extends Plant{

}

static class Tree extends Plant{

}

关系图:

 

测试代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

public static void main(String[] args) {

    List<? super Animal> listA = new ArrayList<>();

    List<? extends Plant> listB = new ArrayList<>();

    //listA.add(new Biological()); 

    listA.add(new Animal());

    listA.add(new Dog());

    //listA.add(new Flower());

    Object object = listA.get(0);

    //listB.add(new Plant());

    //listB.add(new Flower());

    listB.add(null);

    Plant plant = listB.get(0);

}

关于List<? super T>

add方面

1

List<? super Animal> listA = new ArrayList<>();

1

listA.add(new Biological()); 

执行上面这行代码是不允许的,因为listA的集合类型是Animal或者更高的父类,想一下如果代表的类型是Animal,那怎么允许add它的父类Biological呢?当然不允许了。

1

2

listA.add(new Animal());

listA.add(new Dog());

执行上面这两句就是可以正常执行的,因为无论是Animal还是Animal的子类Dog,都是可以存到集合类型是Animal或者更高的父类的集合中的。有点拗口,不过就是这个意思。

1

listA.add(new Flower());

添加Flower当然是不可以的,因为它不是Animal的子类。

返回值方面

1

Object object = listA.get(0);

因为listA的集合类型是Animal或者更高的父类,所以不清楚到底会是哪个类,但是我们都应该清楚所有类的父类都是Object,所以返回值是Object类型的。

关于List<? extendsT>

add方面

1

List<? extends Plant> listB = new ArrayList<>();

1

listB.add(new Plant());

执行上面的代码是不允许的,因为listB的集合类型是Plant或Plant的子类,想一下如果代表的类型是Plant的子类Tree,那么怎么可能可以add它的父类Plant呢?所以跟上面的那个理解差不多,就是反过来理解。看图可以更加清晰。

1

listB.add(new Flower());

这个同理,如何代表的类型是Flower的子类Rose(玫瑰花),这样当然不可以add它的父类Flower了。

1

listB.add(null);

特殊情况就是这个,可以add null,但是也没意义啊。

返回值方面

1

Plant plant = listB.get(0);

因为listB的集合类型是Plant或者它的子类,所以不清楚到底会是哪个类,但是我们可以知道,最高的类型就是Plant了,所以返回值就是Plant类型的。

总结

  • List<? extends T>表示该集合中存的都是类型T的父类,包括T自己
    • add:不能add任何对象(特例:可以添加null)
    • get:get返回的对象类型为T
  • List<? superT>表示该集合中存在的都是类型T的子类,包括T自己
    • add:只能添加T及T的子类
    • get:get返回的对象类型为Object

本篇文章就到这里了,希望能给你带来帮助,也希望您能够多多关注脚本之家的更多内容!

Java泛型通配符?extends与?super的区别与使用场景 我们的目的是让大家清楚地了解Java泛型通配符中?extends和?super的不同之处,以及在什么情况下使用它们。范围主要涵盖这两个通配符的原理、区别和实际应用场景。首先我们会用有趣的故事引入泛型通配符的概念,然后详细解释核心概念,接着分析它们之间的关系,再通过代码示例展示具体的操作步骤,最后介绍实际应用场景、未来发展趋势等内容。Java泛型:就像一个神奇的盒子,这个盒子可以装不同类型的东西,但在使用的时候可以规定它只能装某一类特定的东西。通配符。 阅读详情

相关推荐

Java 之泛型通配符 ? extends T 与 ? super T 通配符解惑

? super T

m0_45406092的博客 2152

掌握Java泛型基础和super通配符,让你事半功倍!

Java泛型,简单来说,就是在编译时进行类型检查的一种机制。它允许程序员在类、接口和方法中使用类型参数,这样的话,我们就可以在编译时确保类型安全,避免了在运行时出现类型转换错误的问题。this.t = t;return t;在上述代码中,T就是一个类型参数,它代表了某种未知的类型。在实际使用时,我们可以将T替换为任何我们需要的类型。super通配符,顾名思义,就是用super关键字定义的通配符。在Java泛型中,我们可以使用List

万猫学社 1676

交叉熵损失函数基本概念及公式

对于二分类问题,模型的输出通常是一个标量,表示样本属于正类的概率。因此,在二分类的交叉熵损失函数中,我们只需要考虑一个概率值,即模型预测为正类的概率。具体来说,当真实标签为1时,我们关注模型预测为正类的概率;当真实标签为0时,我们关注模型预测为负类的概率。因此,二分类的交叉熵损失函数可以表示为:其中,y 表示真实标签,取值为 0 或 1;p 表示模型预测为正类的概率。而对于多分类问题,模型的输出通常是一个向量,表示样本属于各个类别的概率。因此,在多分类的交叉熵损失函数中,我们需要考虑所有类别的概率。

qlkaicx的博客 1万+

Java 泛型 ? extends 与 ? super

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

ikun 的博客 1万+

物联网技术-第2章-物联网技术架构

• 物联网具有很强的异构性• 为实现异构设备之间的互联、互通与互操作,物联网需要以一个开放的分层的可扩展的为框架。

m0_73804764的博客 2976

Windows 11 的C盘User(用户)文件夹下的用户文件夹名称的修改

背景介绍:由于系统重装导致Windows 11的系统用户名与C盘User(用户)文件夹下的用户名文件夹(公用文件夹旁边的文件夹)出现名称不一致,事例中系统用户名命名为“寂萧”,User(用户)文件夹下的文件夹名称却是“77555”。【QQ邮箱前五位真的真的看着很别扭】注:改名有风险,三思而后行。User(用户)文件夹下的用户名是中文在某些软件的应用场景下产生不便,导致很多软件莫名其妙报错,甚至无法使用,笔者不建议修改为中文名。//和笔者一样的强迫症除外//

2302_79084172的博客 10万+

浅谈Java泛型中的extends和super关键字

extends X>这种形式的时候,调用List的add方法会导致编译失败,因为我们在创建具体实例的时候,可能是使用了X也可能使用了X的子类,而这个信息编译器是没有办法知道的,同时,对于ArrayList来说,只能放一种类型的对象。而对于get方法来说,由于我们是通过X或者X的子类来创建实例的,而用超类来引用子类在Java中是合法的,所以,通过get方法能够拿到一个X类型的引用,当然这个引用可以指向X也可以指向X的任何子类。如果类型B是类型A的超类型(父类型),那么C 是 C

qq_66986418的博客 1671

Rust 与 Golang 深度对决:从语法到应用场景的全方位解析

Rust 定义函数以fn关键字开头,参数需明确指定类型,返回值类型紧跟在箭头->之后。// 定义函数add,接收两个i32类型参数a和b,返回i32类型结果,功能为两数相加a + bRust 和 Golang 各有千秋,在不同领域展现独特优势。Rust 凭借强大的内存安全与高性能,在系统编程、网络编程以及对内存安全和性能要求高的场景中表现突出;Golang 则以简洁语法和出色并发性能,在云计算、分布式系统、Web 开发等领域占据一席之地。

muyouking 1769

【Java】泛型 之 super通配符

extendssupe不是的子类。传入是允许的,但是传入是不允许的。和extends通配符相反,这次,我们希望接受类型,以及,因为Number和Object是Integer的父类,和实际上允许接受Integer类型。我们使用super注意到表示,方法参数接受所有泛型类型为Integer或Integer父类的Pair类型。考察的setFirst()因此,可以安全地传入Integer类型。再考察的getFirst()这里注意到我们无法使用Integer类型来接收getFirst()

ihero的博客 849

从零开始利用MATLAB进行FPGA设计(一):建立脉冲检测模型的Simulink模型2

上一期分析了MATLAB的黄金算法原理,这一期进行Simulink模块分析。

WZT725的博客 2086

告别虚拟机!在Windows上用WSL+VSCode搞定ArduPilot开发环境(保姆级避坑指南)

本文提供了一份详细的保姆级指南,介绍如何在Windows上使用WSL和VSCode搭建高效的ArduPilot开发环境,告别虚拟机性能损耗。从WSL安装、VSCode配置到ArduPilot固件编译和调试技巧,涵盖开发全流程中的关键步骤和常见问题解决方案,帮助无人机开发者快速构建专业级开发环境。

weixin_42543046的博客 460

Java泛型解惑之 extends T>和 super T>上下界限

&lt;? extends T&gt;和&lt;? super T&gt;是Java泛型中的“通配符(Wildcards)”和“边界(Bounds)”的概念。 &lt;? extends T&gt;:是指 “上界通配符(Upper Bounds Wildcards)” &lt;? super T&gt;:是指 “下界通配符(Lower Bounds Wildcards)” 一、为什么要用通配符...

ystyaoshengting的专栏 2万+

【实战指南】基于YOLOv11的肺结节检测系统开发与优化(LUNA2016数据集)

本文提供了基于YOLOv11模型和LUNA2016数据集开发肺结节检测系统的完整实战指南。详细介绍了从环境搭建、数据预处理、模型训练与优化,到构建Web应用系统的全流程,旨在帮助开发者快速掌握医疗影像AI项目的核心开发技能。

weixin_29031057的博客 140

这一文,关于 Java 泛型的点点滴滴 二 (extends、super、<?> 通配符、泛型与反射)

本文在上一篇的基础上,介绍了 extends 、super 、?等泛型中的通配符,并在最后介绍了使用泛型获取泛型信息,阅读本文大家会对 Java 泛型有一个更深的理解。

李斯维的博客空间 1748

YOLO11训练中的批量大小(Batch Size)选择策略:分析Batch Size对训练速度、显存占用和模型性能的影响

在深度学习训练过程中,Batch Size(批量大小)是一个至关重要的超参数,它指的是单次迭代中用于更新模型权重的样本数量。简单来说,当我们训练神经网络时,不会一次性将所有数据喂给模型,而是将数据分成若干个小批次(batch),每个批次包含一定数量的样本,这个数量就是Batch Size。 Batch Size的核心作用在于平衡训练效率与模型性能。较小的Batch Size意味着每次更新权重时参考的信息较少,可能导致训练过程更加随机,但有时能带来更好的泛化能力;较大的Batch Size则能提供更稳定的梯

本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 323

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Java泛型中的extends和super理解

在平时看源码的时候我们经常看到泛型,且经常会看到extends和super的使用,看过其他的文章里也有讲到上界通配符和下届通配符,总感觉讲的不够明白。这里备注一下,以免忘记。 extends也成为上界通配符,就是指定上边界。即泛型中的类必须为当前类的子类或当前类。 super也称为下届通配符,就是指定下边界。即泛型中的类必须为当前类或者其父类。 这两点不难理解,extends修饰的只能取,不能...

琉璃甭Bor 4475

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

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

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

微不足道的博客 2203

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

浅显理解Java泛型的super和extends

目录概念简单理解代码样例解读关于List<? super T>add方面返回值方面关于List<? extendsT>add方面返回值方面总结 概念简单理解 List<? extends T>表示该集合中存在的都是类型T的子类,包括T自己 List<? super T>表示该集合中存的都是类型T的父类,包括T自己 代码样例解读 父子类代码: /** * 生物 */ static class Biological{ } /** * 动物 *

『愚』的博客 2310

Java面试 - extends 和super 泛型限定符

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

qq_40395278的博客 3325

Java泛型中的extends和super

1 背景 大佬勇是我这几年的技术导师,不定期向我们传授"绝世武功",当然他的格局不像我那样只在Java那么小。但最近,他却被Java泛型的通配符搞得一头雾水。事缘他最近在研究Java的java.util.Optional类,而该类有很多泛型方法,例如: public<U> Optional<U> map(Function<? super T, ? extends U> mapper) 这个方法的参数是Function实现类的对象,Function是一个函数式接口,它的唯

foshansuperinter的博客 1924

java泛型extends_java泛型extends和super详解

java泛型extends和super详解首先,Java有泛型这一个概念,是为了初衷是为了保证在运行时出现的错误能提早放到编译时检查。有了这个前提,再来看看题主的问题。// 编译会报错// List extends Fruit> appList2 = new ArrayList();// appList2.add(new Fruit());// appList2.add(...

weixin_28723171的博客 2970

泛型中extends和super的区别

extends 泛型中extends的主要作用是设定类型通配符的上限 要理解这句话,我们先从一个例子来看: class Fruit{ public void call() { System.out.println("这是一个水果"); } } class Banana extends Fruit{ @Override public voi...

ywb201314的专栏 2539

Java泛型中extends和super的区别(深入剖析PECS原则与实际应用)

掌握Java泛型中extends和super的区别,深入解析PECS原则及实际应用场景。重点讲解Java泛型的super通配符在集合写入时的安全性优势,对比extends用于读取的差异,提升代码灵活性与类型安全,值得收藏。

InstrWander的博客 1024

java 泛型“T”,“?”,“? extends E”,“? super E”

最近查看java源码,看到很多泛型的应用。原先对泛型也是一知半解,使用的不是很多。今天研究了一下泛型的使用。 泛型的定义就不过多去说了,我就针对<T>,<?>,<? extends E>,<? super E>这几个泛型的使用进行说明。

技术熊的博客小窝 2578
上一篇: ArrayList c.toArray might (incorrectly) not return Object[] (see 6260652)
下一篇: mybatisplus自定义sql使用分页查询
qq_34412985
博客等级 码龄11年 143粉丝 983原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值