java 泛型继承_Java™ 教程(泛型、继承和子类型)

泛型、继承和子类型

如你所知,只要类型兼容,就可以将一种类型的对象分配给另一种类型的对象,例如,你可以将Integer分配给Object,因为Object是Integer的超类型之一:

Object someObject = new Object();

Integer someInteger = new Integer(10);

someObject = someInteger; // OK

在面向对象的术语中,这被称为“是一种”关系,由于Integer是一种Object,因此允许赋值,但是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?答案是“否”,因为Box和Box不是Box的子类型。

在使用泛型编程时,这是一个常见的误解,但这是一个重要的学习概念。

60c57745a71ed5fa15ba878857672208.gif

给定两个具体类型A和B(例如,Number和Integer),MyClass与MyClass无关,无论A和B是否相关,MyClass

有关如何在类型参数相关时在两个泛型类之间创建类似子类型关系的信息,请参阅通配符和子类型。

泛型类和子类型

你可以通过扩展或实现泛型类或接口来对其进行子类型化,一个类或接口的类型参数与另一个类或接口的类型参数之间的关系由extends和implements子句确定。

使用Collections类作为示例,ArrayList implements List,List extends Collection,因此ArrayList是List的子类型,也是Collection的子类型,只要不改变类型参数,就会在类型之间保留子类型关系。

b212b78e033060078577b0e3d1f47a8d.gif

现在假设我们想要定义我们自己的列表接口PayloadList,它将泛型类型P的可选值与每个元素相关联,它的声明可能如下:

interface PayloadList extends List {

void setPayload(int index, P val);

...

}

PayloadList的以下参数化是List的子类型:

PayloadList

PayloadList

PayloadList

14dc2adaaf774b1d254b1fa6ca48b986.gif

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值