以下類定義了兩種方法,這兩種方法直觀地具有相同的功能。每個函數都被調用了兩個類型爲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我不認爲這是一個確切的重複,而密切相關。它涉及將條件運算符應用於通用方法調用的推斷返回類型,這適用於通配符捕獲泛型類型。 –