假设我们有以下代码:
class A {}
class B extends A {}
class C extends B {}
public static <T> T testMe(List<? super T> list1,List<? extends T> list2) {
return null;
}
public static void main(String[] args) {
List<B> listB = new ArrayList<>();
List<C> listC = new ArrayList<>();
// All three variants are possible:
A a=testMe(listB, listC);
B b=testMe(listB, listC);
C c=testMe(listB, listC);
}
问题是关于public static <T> T testMe(List<? super T> list1,List<? extends T> list2)
。编译器如何确定T
类型,如果如有三类:A,B,C,
?当我分析时出现了这个问题Collections.copy
。
在所有3种情况下,编译器都C
将为type参数推断类型T
。
推论算法试图找到最适合所有参数的类型。
对于前2条语句,
A a = testMe(listB, listC);
B b = testMe(listB, listC);
双方B
和C
比赛,因为List<B>
比赛List<? super B>
和List<C>
比赛List<? extends B>
,以及List<B>
比赛List<? super C>
和List<C>
比赛List<? extends C>
。编译器选择最匹配的类型C
。
您可以使用显式类型参数进行编译,以使编译器将其解析为B
:
A a = Super.<B>testMe(listB, listC);
B b = Super.<B>testMe(listB, listC);
在第三行中,仅C
匹配,因此编译器会选择T
。
C c = testMe(listB, listC);
发生这种情况的原因是所分配的变量是类型的C
,并且B
不能分配给C
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句