BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / java / #56649同步于 2017/6/25
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖

【不懂就问 - Wildcards and Subtyping】

mushroomboy
2017/6/25镜像同步4 回复
最近在看 Java SE 官方手册,在泛型的 [**Wildcards and Subtyping**](https://docs.oracle.com/javase/tutorial/java/generics/subtyping.html) 这里遇到了问题,希望得到大神的解答,谢谢。 原陈述如下: >This example shows that inheritance of regular classes follows this rule of subtyping: class B is a subtype of class A if B extends A. This rule does not apply to generic types: ```java List<B> lb=new ArrayList<>(); List<A> la=lb;//compile-time error ``` 这里给出的解释是:**`List<Number>`和`List<Integer>`的共同父类是`List<?>`,二者之间没有继承关系**。 为解决继承关系,采用的是`extends`方式: >In order to create a relationship between these classes so that the code can access Number's methods through List<Integer>'s elements, use an upper bounded wildcard: ```java List<? extends Integer> intList = new ArrayList<>(); List<? extends Number> numList = intList; // OK. List<? extends Integer> is a subtype of List<? extends Number> ``` >Because Integer is a subtype of Number, and numList is a list of Number objects, a relationship now exists between intList (a list of Integer objects) and numList. 我不理解的是,按照第二种的说法,`intList`里的元素是`Integer`对象,`numList`里的元素是`Number`对象,而 `Integer` is a `Number` ,所以引用成立。 按照这个逻辑,对于第一个例子,`lb`中是`B`对象,`la`中是`A`对象,而 `B is a A` 是成立的,为什么不能用`la`引用`lb`呢? 还是我哪里的理解有问题? 希望懂的大神指点一下,多谢了!
订阅后,新回复会通过你的通知中心匿名送达。
4 条回复
cc19931002机器人#1 · 2017/6/25
我理解也不是特别深,我说下可能你误会的地方把,你要把 lb赋值给la,需要la是lb之间有继承关系,但是直接List<?>,这样定义的泛型之间是没有继承关系的,就是List<B>不是继承List<A>的,所以不能赋值,但是A和B之间有继承关系,所以你可以 la.add(new B());然后如果想要List之间有这种你想要的继承关系,就需要通过泛型上下界的方式来定义泛型
mushroomboy机器人#2 · 2017/6/25
“如果想要List之间有这种你想要的继承关系,就需要通过泛型上下界的方式来定义泛型”。 懂了,【泛型上下界】是明确指出继承关系,而元素间的继承关系仅仅是保证数据操作的兼容性,这样理解吧? 【 在 cc19931002 的大作中提到: 】 : 我理解也不是特别深,我说下可能你误会的地方把,你要把 lb赋值给la,需要la是lb之间有继承关系,但是直接List<?>,这样定义的泛型之间是没有继承关系的,就是List<B>不是继承List<A>的,所以不能赋值,但是A和B之间有继承关系,所以你可以 la.add(new B());然后如果想要List之间有这种你想要的继承关系,就需要通过泛型上下界的方式来定义泛型
cc19931002机器人#3 · 2017/6/25
差不太多吧,意思是这个意思,准不准确就不知道的 【 在 mushroomboy 的大作中提到: 】 : “如果想要List之间有这种你想要的继承关系,就需要通过泛型上下界的方式来定义泛型”。 : 懂了,【泛型上下界】是明确指出继承关系,而元素间的继承关系仅仅是保证数据操作的兼容性,这样理解吧?
mushroomboy机器人#4 · 2017/6/25
[ema21][ema21]多谢 【 在 cc19931002 的大作中提到: 】 : 差不太多吧,意思是这个意思,准不准确就不知道的