当类的泛型相关时,如何在两个泛型类之间创建类似子类型的关系呢

2187d29eba6b3367f63dc71aea2a7dcc.gif

作者 | 阿Q

来源 | 阿Q说代码

事情是这样的:

73e06914f13ce92763f6b33858bc7ed4.png

对话中的截图如下:

4f5cf051be08d100f643473f9e9ca811.png

看了阿Q的解释,你是否也和“马小跳”一样存在疑问呢?请往👇看

我们都知道在java中,只要是类型兼容,就可以将一种类型的对象分配给另一种类型的对象。比如可以将一个Integer类型的对象分配给Object类型的对象,因为ObjectInteger的超类。

Object someObject = new Object();
Integer someInteger = new Integer(10);
someObject = someInteger; //OK

在面向对象中,我们把它称之为 is a 的关系。因为IntegerObject的一种子类,所以允许被赋值。

又因为Integer也是Number的一种子类,所以下边的代码也是有效的:

public void someMethod(Number n) { /* ... */ }someMethod(new Integer(10));   // OK
someMethod(new Double(10.1));   // OK

当然泛型也是如此,在执行泛型类型调用时,将Number作为其类型参数传递,如果参数是Number的子类型,则允许任何后续的add调用:

Box<Number> box = new Box<Number>();
box.add(new Integer(10));   // OK
box.add(new Double(10.1));  // OK

现在我们来看以下代码:

public void boxTest(Box<Number> n) { /* ... */ }

该方法接收什么类型的参数呢?

通过该方法,大家肯定知道它的参数类型为Box<Number>,但是大家思考一个问题:你认为Box<Integer>Box<Double>类型的参数可以传入吗?

答案是否定的。

fa85fb8f1bc64fbda5cfb63cf89c01a8.png

尽管IntegerNumber的子类型,但Box<Integer>Box<Double>不是Box<Number>的子类,它俩的父类对象是Object文首的对话表达的就是这个意思。

那么问题来了,当类的泛型相关时,如何在两个泛型类之间创建类似子类型的关系呢?例如如何让Box<Integer>Box<Double>变得与Box<Number>有关呢?

为了搞懂这个问题,我们先来了解一下同一类型的对象是如何实现子类型化的吧。

b2dce193bfbcdc05ce5bb1c24c046449.png

通过分析源码我们可以发现:ArrayList<E> 实现了 List<E>List<E> 继承了Collection<E>,所以ArrayList<String>List<String>的子类型, List<String>Collection<String>的子类型。因此当我们在传递参数时,ArrayList<String>类型的是可以给List<E>或者Collection<E>传递的。

只要不改变类型参数,类型之间的子类型关系就会保留。

如果我们想要定义我们自己的列表接口PayloadList,使得泛型类型P的可选值与每个元素相关联,可以定义如下:

interface PayloadList<E,P> extends List<E> {void setPayload(int index, P val);...
}

da71eec9e4d266288c199b49f6298624.png

PayloadList<String,String>PayloadList<String,Integer>PayloadList<String,Exception>都是List<String>的子类型。

小结:可以通过继承泛型类或者实现接口来对其进行子类型化。

搞懂了子类型化的问题,我们回到“如何在两个泛型类之间创建类似子类型的关系“的问题。

泛型类或者接口并不会仅仅因为它们的类型之间有关系而变得相关,如果要达到相关,我们可以使用通配符来创建泛型类或接口之间的关系。

d150f0708f1fba9e1aced90c9c97b9ad.png

Box<Integer>Box<Number>的父类对象其实是Box<?>

为了在这些类之间创建关系,以便代码可以通过Box<Integer>访问Box<Number>的方法,可以使用上限通配符:

Box<? extends Integer> initBox = new Box<>();
Box<? extends Number> numberBox = initBox;
// OK. Box<? extends Integer> is a subtype of Box<? extends Number>

因为IntegerNumber的子类型,numberBox的泛型是Number对象子类,所以在intBoxnumberBox之间存在关系。

a2730d7e1438885b2c9b928720ef0113.png

图为用上限下限通配符声明的几个类之间的关系。

bf361c0fc2f6abe3cb0c9cceb8ee0af9.gif

d6113c648f0a900a04c403f4fdc82870.png

往期推荐

Redis 缓存击穿(失效)、缓存穿透、缓存雪崩怎么解决?

如果被问到分布式锁,应该怎样回答?

三分钟教你用 Scarlet 写一个 WebSocket App

Java 底层知识:什么是 “桥接方法” ?

9496e269ac00db946cee734bd792c347.gif

点分享

72cfe4ec6f9696b229a6ebd761fcd8ab.gif

点收藏

d22c8d5b14ded068c67dfbabeda8e35b.gif

点点赞

f187250450905f4c7fc5bc43c6343541.gif

点在看

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/512174.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java 垃圾回收 新生代_Java垃圾回收

一、概述Java垃圾回收器实现内存的自动分配和回收&#xff0c;这两个操作都发生在Java堆上(还包括方法区&#xff0c;即永久代)。垃圾回收操作不是实时的发生(对象死亡不会立即释放)&#xff0c;当内存消耗完或者是达到某一指标(threshold,使用内存占总内存的比列&#xff0c;比…

一图看懂云栖大会「云原生」发布

简介&#xff1a; 云原生产品全新升级 原文链接 本文为阿里云原创内容&#xff0c;未经允许不得转载。

明明还有大量内存,为啥报错“无法分配内存”?

作者 | 张彦飞allen来源 | 开发内功修炼近日小伙伴和我说了线上服务器出现一个诡异的问题&#xff0c;执行任何命令都是报错“fork:无法分配内存”。这个问题最近出现的&#xff0c;前几次重启后解决的&#xff0c;但是每隔 2-3 天就会出现一次。# service docker stop -bash f…

先行一步,7大技术创新和突破,阿里云把 Serverless 领域的这些难题都给解了

简介&#xff1a; 函数计算 FC 首创 GPU 实例、业内首发实例级别可观测和调试、率先提供端云联调和多环境部署能力、GB 级别镜像启动时间优化至秒级、VPC 网络建连优化至200ms&#xff0c;Serverless 应用引擎 SAE 支持微服务框架无缝迁移、无需容器化改造、业内首创混合弹性策…

基于Delta lake、Hudi格式的湖仓一体方案

简介&#xff1a; Delta Lake 和 Hudi 是流行的开放格式的存储层&#xff0c;为数据湖同时提供流式和批处理的操作&#xff0c;这允许我们在数据湖上直接运行 BI 等应用&#xff0c;让数据分析师可以即时查询新的实时数据&#xff0c;从而对您的业务产生即时的洞察。MaxCompute…

如何新建java内部类_java内部类-1(内部类的定义)

小胖从官网出发&#xff0c;研究下为什么我们需要些内部类&#xff0c;内部类的区别和联系。思考三个问题&#xff1a;(1)为什么需要内部类&#xff1f;静态内部类和非静态内部类有什么区别&#xff1b;(2)为什么内部类可以无条件访问外部类成员&#xff1b;(3)为什么jdk1.8之前…

stack vs heap:栈区分配内存快还是堆区分配内存快 ?

作者 | 码农的荒岛求生来源 | 码农的荒岛求生有伙伴问到底是从栈上分配内存快还是从堆上分配内存快&#xff0c;这是个比较基础的问题&#xff0c;今天就来聊一聊。栈区的内存申请与释放毫无疑问&#xff0c;显然从栈上分配内存更快&#xff0c;因为从栈上分配内存仅仅就是栈指…

CDP 平台简介

简介&#xff1a; EDC 建立在 Cloudera Data Platform(CDP) 之上&#xff0c;该产品结合了 Cloudera Enterprise Data Hub 和 Hortonworks Data Platform Enterprise 的优点&#xff0c;并在技术堆栈中增加了新功能和对已有技术提供了增强功能。这种统一的发行是一个可扩展且可…

400倍加速, PolarDB HTAP实时数据分析技术解密

简介&#xff1a; PolarDB MySQL是因云而生的一个数据库系统, 除了云上OLTP场景&#xff0c;大量客户也对PolarDB提出了实时数据分析的性能需求。对此PolarDB技术团队提出了In-Memory Column Index(IMCI&#xff09;的技术方案&#xff0c;在复杂分析查询场景获得的数百倍的加速…

建立数字化、学习型人事平台,HR 与业务终于不再「隔空对话」

本篇文章暨 CSDN《中国 101 计划》系列数字化转型场景之一。 《中国 101 计划——探索企业数字化发展新生态》为 CSDN 联合《新程序员》、GitCode.net 开源代码仓共同策划推出的系列活动&#xff0c;寻访一百零一个数字化转型场景&#xff0c;聚合呈现并开通评选通道&#xff…

OpenYurt 深度解读|开启边缘设备的云原生管理能力

简介&#xff1a; 北京时间 9 月 27 号&#xff0c;OpenYurt 发布 v0.5.0 版本。新发布版本中首次提出 kubernetes-native非侵入、可扩展的边缘设备管理标准&#xff0c;使 Kubernetes 业务负载模型和 IOT 设备管理模型无缝融合。 作者&#xff5c;贾燚星(VMware), 何淋波(阿里…

Cloudera Manager 术语和架构

简介&#xff1a; 本文介绍了Cloudera Manager 的常见术语和架构 Cloudera Manager 术语 为了有效地使用Cloudera Manager&#xff0c;您应该首先了解其术语。 术语之间的关系如下所示&#xff0c;其定义如下&#xff1a; 有时&#xff0c;术语服务和角色用于同时指代类型和…

冬奥网络安全卫士被表彰突出贡献,探寻冬奥背后的安全竞技

奥运史上首次公开招募白帽子担任“冬奥网络安全卫士”。 据统计&#xff0c;从冬奥会开始到冬残奥会闭幕式结束&#xff0c;奇安信共检测日志数量累积超1850亿&#xff0c;日均检测日志超37亿&#xff0c;累计发现修复漏洞约5800个&#xff0c;发现恶意样本54个&#xff0c;排查…

打破 Serverless 落地边界,阿里云 SAE 发布 5 大新特性

简介&#xff1a; SAE 的 5 大新特性、4 大最佳实践&#xff0c;打破了 Serverless 落地的边界&#xff0c;让 All on Serverless 成为可能. 微服务场景&#xff0c;开源自建真的最快最省最稳的&#xff1f;复杂性真的会成为 Kubernetes 的“致命伤”吗&#xff1f;企业应用容…

java线程一定是thread_深入理解Java多线程(multiThread)

多线程的基本概念一个java程序启动后&#xff0c;默认只有一个主线程(Main Thread)。如果我们要使用主线程同时执行某一件事&#xff0c;那么该怎么操作呢&#xff1f;例如&#xff0c;在一个窗口中&#xff0c;同时画两排圆&#xff0c;一排在10像素的高度&#xff0c;一排在5…

技术解读|云上企业级存储——打开存储新维度,促进用户核心业务创新

简介&#xff1a; 将企业级存储和云的特点进行完美的融合是云上企业级存储的目标&#xff0c;它打开存储更多新的维度&#xff0c;在保障用户业务永续的同时&#xff0c;帮助用户更好的进行业务创新。本文属ESSD技术解读的总篇&#xff0c;总体介绍ESSD 云盘创新融合了云和企业…

金蝶发布2021年财报:云业务同比增44.2%,继续加码研发技术创新

编辑 | 宋慧 出品 | CSDN云计算 金蝶国际软件集团有限公司&#xff08;“金蝶国际”、“金蝶”或“公司”&#xff0c;连同其附属公司统称“集团”&#xff1b;股份编号&#xff1a;0268.HK&#xff09;今日公布其截至2021年12月31日止十二个月&#xff08;“报告期”&#xf…

分布式系统一致性测试框架Jepsen在女娲的实践应用

简介&#xff1a; 女娲团队在过去大半年时间里持续投入女娲2.0研发&#xff0c;将一致性引擎和业务状态机解耦&#xff0c;一致性引擎可支持Paxos、Raft、EPaxos等多种一致性协议&#xff0c;根据业务需求支撑不同的业务状态机。其中的一致性引擎模块是关键&#xff0c;研发一致…

“预习-上课-复习”:达摩院类人学习新范式探索

简介&#xff1a; 预习时关注重点&#xff0c;上课时由易到难&#xff0c;复习时举一反三&#xff0c;能否让机器也按照“预习-上课-复习”的学习范式进行学习呢&#xff1f; 达摩院对话智能&#xff08;Conversational AI&#xff09;团队对这个问题进行了研究探索&#xff0c…

云上虚拟IDC(私有池)如何为客户业务的确定性、连续性保驾护航

简介&#xff1a; 企业业务上云后&#xff0c;还面临特定可用区购买云上特定计算产品实例失败的困境&#xff1f;云上私有池pick一下 Why 云上业务为什么需要资源确定性、服务连续性 云计算正朝着像水电煤一样的基础设施演进&#xff0c;支持用户按需使用、按量付费。目前&am…