2013-01-15 58 views
8

可能重複:
What’s the difference between <?> and <? extends Object> in Java Generics?列表<?> vs List <?擴展對象>

我發現List<?>,並以同樣的方式List<? extends Object>行爲。至於我,他們之間沒有區別。如果我不對,你能解釋一下嗎?

import java.util.ArrayList; 
import java.util.List; 

public class TestClass { 

static void func1(List<?> o, Object s) { 
    o.add(null); // only null 
    o.add(s); // wrong 
    o.get(0); // OK 
} 

static void func2(List<? extends Object> o, Object s) { 
    o.add(null); // only null 
    o.add(s); // wrong 
    o.get(0); // OK 
} 

public static void main(String[] args) { 
    func1(new ArrayList<String>(), new Integer(1)); 
    func2(new ArrayList<String>(), new Integer(1)); 

    List<? extends Object> list1 = new ArrayList<Object>(); 
    List<?> list2 = new ArrayList<Object>(); 

    List<? extends Object> list3 = new ArrayList<String>(); 
    List<?> list4 = new ArrayList<String>(); 
} 
} 
+5

沒有什麼區別。 'extends Object'是多餘的,否則就像寫'class F extends Object'一樣。 –

+1

我敢打賭,它們是等價的,因爲Java中的所有類都隱式擴展了'Object'。 – murgatroid99

+1

沒有什麼區別,這是語言設計/語法的結果。 – nullpotent

回答

1

兩者都是相同的,因爲Java中的所有對象都擴展爲Object。我更喜歡List<?>,因爲它更簡潔。

1

MyClass extends Object類似,List<? extends Object>List<?>相同。

0

雖然我是剽竊馬爾科,對此我表示歉意,他的評論是正確的答案。

沒有什麼區別,因爲隱含每種類型extends Object

9

很複雜......

對於任何類型的變量T,規範說http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.4

每一個類型的變量...有一個約束。如果沒有爲類型變量聲明綁定,則假定爲Object。

人們會認爲它通配符是真的太強了,?應該只是爲? extends Object的簡寫。

但是通過規範搜索,沒有證據表明通配符必須有上限(或下限)。 「無界的」?一致對待有界通配符。

我們可以從子類型規則推斷,即List<?>List<? extends Object>是相互的,即亞型,它們是基本上同一類型。 (扣除依賴於一個事實,即在Einterface List<E>有一個隱上限Object;但規則不要求上通配符邊界)

儘管如此,規範治療的兩個不同。例如http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.7List<?>是reifiable類型,但List<? extends Object>不是,這意味着

// ok 
    List<?>[] xx = {}; 
    // fail 
    List<? extends Object>[] yy = {}; 

    // ok 
    boolean b1 = (y instanceof List<?>); 
    // fail 
    boolean b2 = (y instanceof List<? extends Object>); 

我不明白爲什麼,但。說通配符必須有一個上限和一個下限似乎很不錯,默認爲Objectnull type

+0

但是,有這樣的'給定一個通用類型聲明G ,G 大致類似於4.5.1下的一些X <: B. G。 – nullpotent

+0

@iccthedral - 應用於'List'的情況,'列表大致類似於列表對於某些X <:Object' – irreputable

+1

嗯,是的。這是我的觀點。 'X <:B'應該(?)是一個包含性的子類型關係,但是我找不到這個參考。這是因爲'T擴展C'也是包含的。 – nullpotent

相關問題