【发布时间】:2014-01-30 16:26:27
【问题描述】:
下面的类定义了两个方法,这两个方法直观地具有相同的功能。每个函数都使用两个 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 语言规范,并直观地解释如果不是这种情况可能会出现什么问题预防。
【问题讨论】:
-
@BrianRoach 我不认为这是完全重复的,但密切相关。它涉及应用于从泛型方法调用推断返回类型的条件运算符,其中这应用于通配符捕获泛型类型。
标签: java generics ternary-operator bounded-wildcard