为什么三元运算符不喜欢带有有界通配符的泛型类型?
下面的类定义了两个方法,这两个方法直观地具有相同的功能。每个函数都使用两个类型列表和一个布尔值进行调用,该值指定应将哪些列表分配给局部变量。List<? super Integer>
import java.util.List;
class Example {
void chooseList1(boolean choice, List<? super Integer> list1, List<? super Integer> list2) {
List<? super Integer> list;
if (choice)
list = list1;
else
list = list2;
}
void chooseList2(boolean choice, List<? super Integer> list1, List<? super Integer> list2) {
List<? super Integer> list = choice ? list1 : list2;
}
}
根据 ,是有效的,而不是。它抱怨:javac 1.7.0_45
chooseList1
chooseList2
java: incompatible types
required: java.util.List<? super java.lang.Integer>
found: java.util.List<capture#1 of ? extends java.lang.Object>
我知道查找包含三元运算符()的表达式类型的规则非常复杂,但据我所知,它选择了最具体的类型,第二个和第三个参数都可以转换为没有显式强制转换。在这里,这应该是,但事实并非如此。… ? … : …
List<? super Integer> list1
我希望看到一个关于为什么情况并非如此的解释,最好是参考Java语言规范,并直观地解释如果不加以阻止,可能会出错。