泛型方法上的多個通配符使Java編譯器(還有我!)很迷茫讓我們首先考慮一個簡單的場景(見ideone.com上的完整源代碼):import java.util.*;public class TwoListsOfUnknowns {
static void doNothing(List<?> list1, List<?> list2) { }
public static void main(String[] args) {
List<String> list1 = null;
List<Integer> list2 = null;
doNothing(list1, list2); // compiles fine!
}}這兩個通配符是不相關(guān)的,這就是為什么您可以調(diào)用doNothing帶著List<String>和一個List<Integer>..換句話說,這兩個?可以引用完全不同的類型。因此,以下內(nèi)容不編譯,這是預(yù)期的(也在ideone.com上):import java.util.*;public class TwoListsOfUnknowns2 {
static void doSomethingIllegal(List<?> list1, List<?> list2) {
list1.addAll(list2); // DOES NOT COMPILE!!!
// The method addAll(Collection<? extends capture#1-of ?>)
// in the type List<capture#1-of ?> is not applicable for
// the arguments (List<capture#2-of ?>)
}}到目前為止還不錯,但事情開始變得很混亂。如ideone.com所見):import java.util.*;public class LOLUnknowns1 {
static void probablyIllegal(List<List<?>> lol, List<?> list) {
lol.add(list); // this compiles!! how come???
}}上面的代碼是在Eclipse中為我編譯的sun-jdk-1.6.0.17在ideone.com中,但是它應(yīng)該嗎?難道我們不可能List<List<Integer>> lol和一個List<String> list,類似的兩個不相關(guān)的通配符情況TwoListsOfUnknowns?實(shí)際上,以下對這個方向的輕微修改并不是編譯的,這是預(yù)期的(如ideone.com所見):import java.util.*;public class LOLUnknowns2 {
static void rightfullyIllegal(
List<List<? extends Number>> lol, List<?> list) {
lol.add(list); // DOES NOT COMPILE! As expected!!!
// The method add(List<? extends Number>) in the type
// List<List<? extends Number>> is not applicable for
// the arguments (List<capture#1-of ?>)
}}所以看起來編譯器正在做它的工作,但是我們得到了這個(如ideone.com所見):import java.util.*;public class LOLUnknowns3 {
static void probablyIllegalAgain(
List<List<? extends Number>> lol, List<? extends Number> list) {
lol.add(list); // compiles fine!!! how come???
}}再一次,我們可能有List<List<Integer>> lol和一個List<Float> list所以這不應(yīng)該編譯,對吧
3 回答

ibeautiful
TA貢獻(xiàn)1993條經(jīng)驗(yàn) 獲得超6個贊
static void probablyIllegal(List<Class<?>> x, Class<?> y) { x.add(y); // this compiles!! how come???}
static void probablyIllegal(Class<?>[] x, Class<?> y) { x.add(y); // this compiles!! how come???}
Class<String>
和 a Class<Int>
static<T> void probablyIllegal(Class<T>[] x //homogeneous! not the same!
Class<?>
Class<T>
T
Class<?>
Class<T>
T
添加回答
舉報
0/150
提交
取消