如何在两个相关泛型类之间创建类似子类型的关系
创始人
2024-01-30 08:32:24

本文正在参加「金石计划 . 瓜分6万现金大奖」

哈喽大家好,我是阿Q!

事情是这个样子的......

对话中的截图如下:

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

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

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 box = new Box();
box.add(new Integer(10));   // OK
box.add(new Double(10.1));  // OK
复制代码

现在我们来看以下代码:

public void boxTest(Box n) { /* ... */ }
复制代码

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

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

答案是否定的。

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

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

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

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

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

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

interface PayloadList extends List {void setPayload(int index, P val);...
}
复制代码

PayloadListPayloadListPayloadList都是List的子类型。

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

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

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

Box 和Box的父类对象其实是Box

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

Box initBox = new Box<>();
Box numberBox = initBox;
// OK. Box is a subtype of Box
复制代码

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

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

相关内容

热门资讯

埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
最安全的匿名举报方式 匿名12... 来源:中安在线8月9日,河北邢台小伙张钊(化名)在河北政务服务网12345平台举报楼上邻居涉嫌非法开...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
中国光棍有多少人 2020年9... 我国是世界上人口最多的国家,庞大的人口基数为我国的发展带来了许多的益处。但是同时,我国也是出生人口性...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...