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

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

Java 泛型中的 extends 和 super 是用来限制泛型类型参数的上限和下限的关键字。它们可以在定义泛型类、泛型方法、泛型接口时使用。

extends 关键字用于限制泛型类型参数的上限,表示该泛型类型参数必须是指定类型或指定类型的子类。例如:

public class GenericClass<T extends Number> {
    // ...
}

在这个泛型类中,T 的类型参数被限制为 Number 类型或其子类,例如 Integer、Double 等。这样定义后,如果我们创建这个泛型类的实例时,T 类型的实参必须是 Number 或 Number 的子类。

super 关键字用于限制泛型类型参数的下限,表示该泛型类型参数必须是指定类型或指定类型的父类。例如:

public class GenericClass<T super Integer> {
    // ...
}

在这个泛型类中,T 的类型参数被限制为 Integer 类型或其父类。这样定义后,如果我们创建这个泛型类的实例时,T 类型的实参必须是 Integer 或 Integer 的父类。

总的来说,extends 和 super 关键字的作用是限制泛型类型参数的范围,使得泛型类型参数在使用时更加安全和可靠。

举个例子:

在 Java 中,<R, C extends Column<R>> 是一个泛型类型参数的声明,其中:

  • <R, C> 表示这是一个包含两个类型参数的泛型类型参数声明。
  • extends Column<R> 表示泛型类型参数 C 是一个继承自 Column<R> 类的类型。

这个声明可以被用于定义方法参数、返回类型、类或接口的类型参数等。

具体来说,这个声明的意思是:

  • R 表示这个泛型类型参数中要使用的类型参数,它可以是任何合法的 Java 类型。
  • C 表示这个泛型类型参数中要使用的类型参数,它必须是继承自 Column<R> 的类型,也就是说 C 类型必须包含一个类型参数为 R 的 Column 类型。

Column 类型可能是一个抽象类或者接口,也可能是一个具体的类,它的定义可能类似于:

public abstract class Column<R> {
    public abstract R getValue();
    public abstract void setValue(R value);
    // ...
}

或者:

public class StringColumn extends Column<String> {
    private String value;
    // ...
}

因此,<R, C extends Column<R>> 声明的类型参数 C 表示一个继承自 Column<R> 的类,可以使用 R 来指定这个类型的值类型。当使用这个类型参数时,需要提供一个满足条件的具体类型,例如:

public <R, C extends Column<R>> void someMethod(C column) {
    // ...
}

StringColumn column = new StringColumn();
someMethod(column);

在上面的例子中,C 被替换为 StringColumn,而 R 被替换为 String。因此,column 参数的类型是 StringColumn,它继承自 Column<String>。

Java泛型专题之6、如何理解 Java 中的 <T extends Comparable<? super T>> <T extends Comparable<T>>表明T实现了Comaprable<T>接口,此条件强制约束,泛型对象必须直接实现Comparable<T>(所谓直接就是指不能通过继承或其他方式) <T extends Comparable<? super T>> 表明T的任意一个父类实现了Comparable<? ... 阅读详情

相关推荐

Java泛型三:通配符详解extends super

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

天将降大任于是人 2万+

Java 泛型 ? extends 与 ? super

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

ikun 的博客 1万+

Java泛型三篇文章,让你彻底理解泛型(super ,extend等区别)

本人搜集的资料,看了这三篇,泛型彻底理解了。

泛型——super通配符

我们前面已经讲到了泛型的继承关系:Pair不是Pair的子类。 考察下面的set方法: void set(Pair<Integer> p, Integer first, Integer last) { p.setFirst(first); p.setLast(last); } 传入Pair是允许的,但是传入Pair是不允许的。 和extends通配符相反,这次,我们希望接受Pair类型,以及Pair、Pair,因为Number和Object是Integer的父类,setFirs

weixin_46722612的博客 1826

MCP4728 电路及stm32F103程序移植

写在前面 通过优快云查到一些MCP4728 的程序,结合程序及datasheet对于驱动的描述,理清了思路 感谢开路者! MCP4728的电路比较简单,见下文描述 应用电路 datasheet: 实际测试电路: SCL接stm32的PB10,SDA接PB11 RDY/BSY引脚和LDCA引脚,悬空 解释见截图: MCP4728地址 选择任意输出通道写入DAC输入寄存器 应用程序 int mcp4728_write_all_channel(float vol1, float vol2, fl

u013074298的专栏 5425

LangChain Agent Skills 实战指南:12个案例玩转智能体技能封装与编排

大语言模型应用开发中,智能体(Agent)的能力扩展正从零散的函数调用走向标准化封装。Agent Skills 将某项具体能力组织为带说明、代码与依赖的技能目录,让模型能自动发现和调度,其核心价值在于解决工具数量膨胀后的维护混乱与调用失控问题。与 Tool 的单一执行、MCP 的协议连接不同,Skill 更强调能力的语义描述与组合复用,配合 LangGraph 的状态编排和 LangSmith 的可观测性,可构建生产级智能体系统。在实际场景中,Agent Skills 可覆盖 RAG 知识库问答、多轮记忆保

weixin_34335458的博客 407

Java泛型中的extends和super理解

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

琉璃甭Bor 4475

整合Springboot+MybatisPlus+达梦数据库

整合Springboot+MybatisPlus+达梦数据库,以及一些坑

波波的博客 6677

深入理解 Java 泛型的通配符:? extends T 和 ? super T

本文介绍了Java泛型中的通配符机制,重点分析了? extends T(上界通配符)和? super T(下界通配符)的使用场景与特性。上界通配符允许安全读取数据但不能写入,而下界通配符支持写入操作但只能读取Object类型数据。文章通过代码示例演示了两种通配符的实际应用,并解释了PECS原则(Producer Extends, Consumer Super)来指导正确选择通配符类型。最后展示了通配符在数据拷贝场景中的具体应用,帮助开发者编写更灵活可靠的泛型代码。

Knight 900

超越PSPNet:PPM模块在医疗影像分割中的创新应用实验

本文探讨了PPM模块在医疗影像分割中的创新应用,通过定制化调整和优化策略显著提升分割精度。针对医疗影像的多尺度病灶特点,提出了动态尺度选择和交叉尺度融合模块(CSFM),结合PyTorch实现细节,使小病灶检测召回率提升11.3%。实验显示优化后的模型mIoU达到78.6%,较基线提升9.2个百分点,同时满足实时处理需求。

u9v0w的博客 218

全国30米分辨率逐年植被覆盖度(FVC)数据集

植被覆盖度是描述地表植被的重要参数与生态环境的基本指标,在大气圈、土壤圈、水圈和生物圈中都占据着重要的地位,区域及全球范围的植被覆盖度估算对植被及相关领域的研究具有重要意义。往往参照《土壤侵蚀分类分级标准》,将植被覆盖度划分为4个等级:<30%为低覆盖度、30%—45%为中低覆盖度、45%—60%为中覆盖度、>60%为高覆盖度。本数据集包括1986至2022年间,全国植被覆盖度数据,FVC范围值为0-1,数据为浮点型,GeoTIFF格式。NDVImax 和NDVImin分别为区域内最大和最小的NDVI值。

地球资源数据云的官方博客 1965

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

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

微不足道的博客 2203

手把手教你用Cadence Virtuoso完成LNA全套仿真:基于SpectreRF手册的实战补充

本文详细指导如何使用Cadence Virtuoso和SpectreRF完成LNA的全套仿真,涵盖噪声仿真、增益压缩、THD分析及双音IP3测量等关键步骤。针对官方手册中的常见问题,提供了12个实战解决方案,包括hbnoise函数选择、双音信号源配置等,帮助工程师高效完成射频IC设计。

weixin_29102619的博客 521

java泛型"? extends Fruit" 和"? super Fruit"的理解和区别

? extend Fruit 表示泛型变量:该泛型变量是一个未知类型,只知道这个变量是继承自Fruit类型或者是Fruit类型。 ? super Apple 表示泛型变量:该泛型变量是一个未知类型,只知道这个变量是Apple的父类型或Apple类型。

jhgy2的专栏 1830

微信小程序 - 解决报错 operateAudio:fail audioInstance is not set(wx.getRecorderManager苹果ios真机调试运行,播放音频播放出错解决)

微信小程序,苹果ios系统,真机测试报错,播放音频报错operateAudio:fail audioInstance not exist,errCode: -1,小程序生成音频播放报错errMsg,真机调试报错开发者工具没问题,wx.getRecorderManager,音频实例,InnerAudioContext,各种方法都试了不行,只有ios苹果手机有这个问题,IOS 出现 operateAudio,在iOS无法播放的解决方案,更新到最新版本了还是不行,链接没有特殊字符,微信小程序全局音频设置,手机上播

🏆 前端领域优质创作者 1万+

6万字嵌入式最全八股文面试题大全及参考答案(持续更新)

进程上下文定义:进程上下文包含了进程执行时所需的所有信息,包括 CPU 寄存器的值、内核栈、任务控制块(TCB)等。作用:当进程被切换时,需要保存当前进程的上下文,并恢复下一个将要运行进程的上下文。中断上下文定义:中断上下文是指处理中断时 CPU 所处的状态,包括中断发生时的寄存器值等。作用:当中断发生时,CPU 会自动保存当前的上下文信息,并跳转到相应的中断处理程序。示例表格上下文描述进程上下文包含进程执行时的所有相关信息中断上下文处理中断时 CPU 所处的状态线程同步定义。

大模型大数据攻城狮的专栏 7924

浅显理解Java泛型的super和extends

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

『愚』的博客 2310

IEM模型,地表粗糙度模拟

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

Java泛型 extends,super和通配符的理解

1.java泛型的特点 通常情况下,一个编译器处理泛型有两种方式:      1.Code specialization。在实例化一个泛型类或泛型方法时都产生一份新的目标代码(字节码or二进制代码)。例如,针对一个泛型list,可能需要 针对string,integer,float产生三份目标代码。      2.Code sharing。对每个泛型类只生成唯一的一份目标代码;该泛型类的所有

The Void 2082

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

原理性地理解 Java 泛型中的 extends、super 及 Kotlin 的协变、逆变

相信大多学习过 Java 的都对 extends 和 super 产生过疑惑,特别是坑爹的 PECS 原则,又是英文缩写,又是消费者生产者的,如此抽象的结论,这是正常人应该记的吗? 不吐槽,回归正题,网上有许多文章对 extends 和 super 进行过各种解析,基本都能得出如下类似的结论: extends 可用于的返回类型限定,不能用于参数类型限定。 super 可用于参数类型限定,不...

我的学习笔记 822

泛型 java extends_Java泛型中extends和super的理解

extends T>和 extends > 是Java泛型中的“通配符(Wildcards)”和“边界(Bounds)”的概念。 extends T>:是指“上界通配符(Upper Bounds Wildcards” extends >: 是指“下界通配符(Lower Bounds Wildcards)”1. 为什么要用通配符和边界?使用泛型的过程中,经常出现一种很别扭的...

weixin_39612653的博客 634

java 中的extends_Java泛型中extends和super的理解

作者:zhang siege链接:https://www.zhihu.com/question/20400700/answer/91106397来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。首先,泛型的出现时为了安全,所有与泛型相关的异常都应该在编译期间发现,因此为了泛型的绝对安全,java在设计时做了相关的限制:List extends E>表示该list集...

weixin_30786631的博客 462

Java泛型中extends和super的理解(转)

E – Element (在集合中使用,因为集合中存放的是元素) T – Type(Java 类) K – Key(键) V – Value(值) N – Number(数值类型) ? – 表示不确定的java类型(无限制通配符类型) S、U、V – 2nd、3rd、4th types Object – 是所有类的根类,任何类的对象都可以设置给该Obje...

weixin_34245169的博客 79

java中super()_Java泛型中的extends和super理解

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

weixin_33508642的博客 251

Java泛型中extends和super的理解

Java泛型中K T V E ? object等的含义 E – Element (在集合中使用,因为集合中存放的是元素) T – Type(Java 类) K – Key(键) V – Value(值) N – Number(数值类型) ? – 表示不确定的java类型(无限制通配符类型) S、U、V – 2nd、3rd、4th types Object – 是所有类的根类,任

Franco的博客 1万+

java中extends jframe是什么意思_Java泛型中的extends和super理解

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

weixin_39842271的博客 2153
下一篇: 【Java】 i++和++i的区别
hellworld1993
博客等级 码龄5年 1粉丝 5原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值