此答案适用于Java 7。
Java语言规范规定了有关条件运算符()的以下内容
?:
否则,第二和第三操作数分别为S1和S2类型。令T1为对S1进行装箱转换所产生的类型,而T2为对S2进行装箱转换所产生的类型。
条件表达式的类型是将捕获转换(§5.1.10)应用于lub(T1,T2)(§15.12.2.7)的结果。
在表达中
List<? super Integer> list = choice ? list1 : list2;
T1是
List<capture#1? super Integer>并且
T2是
List<capture#2? superInteger>。两者都有下限。
本文详细介绍了如何计算
lub(T1, T2)(或
join function)。让我们从那里举个例子
<T> T pick(T a, T b) { return null;}<C, A extends C, B extends C> C test(A a, B b) { return pick(a, b); // inferred type: Object}void tryIt(List<? super Integer> list1, List<? super Integer> list2) { test(list1, list2);}如果使用IDE并将鼠标悬停在
test(list1, list2),您会注意到返回类型为
List<? extends Object>
这是Java的类型推断可以做的最好的事情。如果
list1为a
List<Object>和
list2为a
List<Number>,则唯一可接受的返回类型为
List<? extends Object>。因为必须解决这种情况,所以该方法必须始终返回该类型。
同样在
List<? super Integer> list = choice ? list1 : list2;
该
lub(T1, T2)又是
List<? extends Object>和它的捕获转换
List<capture#XX of ? extendsObject>。
最后,
List<capture#XX of ? extends Object>不能将类型的引用分配给类型的变量,
List<? superInteger>因此编译器不允许这样做。



