How List<Object> is subtype of List<? super Number>
阅读Java泛型和集合时。在带super的通配符部分,我提供了一个示例
1 2 3 4 5
public static < T> void copy( List<? super T> dst, List<? extends T> src) {
for ( int i = 0 ; i < src.size ( ) ; i++ ) {
dst.set ( i, src.get ( i) ) ;
}
}
它被称为:
以上通话有效,解释如下:
The call is permitted because objs has type List , which is a subtype of List super Number> (since Object is a supertype of Number , as required by the wildcard) and ints has type List , which is a subtype of List extends Number> (since Integer is a subtype of Number , as required by the extends wildcard)
我怀疑List 是List super Number> 的亚型吗?
@我不是在解释清单吗?super number>正确,当object是all的supertype时,那么为什么list<?super number>是列表的supertype
@普拉泰克:我不一定要用"subtype",但是Object 肯定满足? super Number 中的通配符,不是吗?
@因为对象是超类型?超数。那么为什么list是list的子类型<?超数>yshavit的答案是在讨论反向变化,但我不明白编译器是如何理解它的。
@Prateek:同样,在这种情况下,我可能不会使用子类型和父类型——至少在没有仔细检查规范的情况下不会这样做——但是我会说Object 满足通配符的要求,因此调用是有效的。(可能在技术上它确实是一个子类型;我只需要仔细检查一下。)
好的。这意味着如果我传递的不是对象list那么它也将是一个有效的调用,因为它也满足了要求。明白了。谢谢。。。
@普拉蒂克这样想。类型A 是类型B 的超类型,如果类型B 的每个对象也恰好是类型A 的对象。这就是超类型的定义。所以,问题是——List 类型的每个对象也是List super Number> 类型的对象。答案显然是肯定的。
@你能把这个解释也写在你的答案里吗?也许对其他人也有帮助…
是啊,这主意不错。会的。不过,我可以换一种说法,因为这个问题涉及的是子类型而不是超类型。
下面是子类型的定义。X 类型是Y 类型的子类型,前提是X 类型的每个对象或原语也是Y 类型。因此,您所问的问题是,List 类型的每个对象是否(或如何)也是List super Number> 类型。
现在,? super Number 部分的意思是"任何属于Number 的超类型,包括Number 本身"。只有两种类型——Number 和Object 。
因此,List super Number> 是一个抽象类型,包含List 和List ,没有其他类型(当然,除了这两个类型的子类型之外)。
但是list不能是list of number的子类型,因此只剩下list了。
@Prateek不是Number 的有效替代品吗?
它是一个有效的子空间,但我会与listargument混淆,后者被称为list<?super number>(其中list可以是有效的super而不是list)
@prateek List 在技术上不是List super Number> 的一个亚型,它们都是List 的。但是,List 是List super Number> 的有效替代品,因为Object 是? super Number 的有效替代品。
@扎金斯特。不,List 绝对是List super Number> 的一个亚型。
EDCOX1 16是Java的怪异方式,称为"逆变"。
首先用协方差来概括:A extends B> 是A extends C> 的一个亚型,而B 是C 的一个亚型。因此,List extends Number> 是List extends Object> 的一个亚型。
相反,A super B> 是A super C> 的一个亚型,而C 是B 的一个亚型。因此,List super Object> 是List super Number> 的一个亚型。
好吧,这就是我需要的……谢谢克里斯
但是,如何证明这种变动是合理的,你能解释一下吗?
我不知道你在问什么。这只是一个逆变泛型类型的定义。
我是说,编译器如何理解这种行为?
也许你想和描述抗争。这样想:
List super Number> 意味着只要对象是一个超级数字类,它就应该是一个存储任何对象的列表。因此,List 显然符合标准。