java泛型类继承_Java泛型学习笔记 - (六)泛型的继承

在学习继承的时候, 我们已经知道可以将一个子类的对象赋值给其父类的对象, 也就是父类引用指向子类对象, 如:

1 Object obj = new Integer(10);

这其实就是面向对象编程中的is-a关系. 既然上面的代码正确, 那么在泛型中, 也可以使用如下代码:

1 public class Box{2 privateT obj;3

4 publicBox() {}5

6 publicT getObj() {7 returnobj;8 }9

10 public voidsetObj(T obj) {11 this.obj =obj;12 }13

14 publicBox(T obj) {15 super();16 this.obj =obj;17 }18 }

调用:

1 Box b = new Box<>();2 Integer i = 10;3 Double d = 2.3;4 b.setObj(i);5 System.out.println(b.getObj());6 b.setObj(d);7 System.out.println(b.getObj());

这是正确的, 因为10, 2.3的类型都是Number的子类. 但是, 假设我们有如下方法:

1 public static void print(Boxb) {2 System.out.println(b.getObj());3 }

然后我们调用:

1 Box b1 = new Box<>();2 Integer i = 10;3 b1.setObj(i);4 print(b1);

以上的程序也是能够正常运行的, 但是如果我们改用如下的方式来调用:

1 Box b2 = new Box<>();2 b2.setObj(10);3 print(b2); //编译失败

这就不会通过编译. 因为, 无论Integer和Number的关系如何, Box和Box是没有关系的, 他们之间唯一的关系就是他们都是Object的子类. 如图所示:

7682ff7cfa1bacee26edf29abbe8a3b2.gif

(如果想要让他们也拥有继承关系, 请参看我的下一篇博文《浅析泛型中通配符的使用》)

那么泛型类之间拥有继承(或实现接口)关系是怎样的呢? 我们以List和ArrayList为例:

通过查看API文档, 我们可以发现ArrayList类是这样的:

1 public class ArrayListextends AbstractListimplements List, RandomAccess, Cloneable, Serializable

而List接口又是:

1 public interface Listextends Collection

这时, 我们就可以说ArrayList实现了List接口继承了Collection接口, 相信这样的例子我们已经见的不少了:

1 List list = new ArrayList();

138bb11679673eb6559fcc913a226dc0.gif

我们也可以自己定义具有继承关的泛型, 下面是一个继承了List接口的泛型接口:

1 interface PayloadList extends List{2 void setPayload(intindex, P val);3 ...4 }

如果我们有如下的类实现该接口:

1 PayloadList

2 PayloadList

3 PayloadList

那么他们之间的关系就如图所示:

e7806d23ac6f940cdf2718d98fd6cfc6.gif

总结: 两个类(甚至是同一个类)的泛型所具有继承(或实现)关系并不能代表这两个类之间的关系. 除非这两个类是有着明确的继承(或实现关系), 其泛型间的关系并不能对其造成影响.

References:

https://docs.oracle.com/javase/tutorial/java/generics/inheritance.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值