2012-11-17 47 views
3

鑑於類型List<?>List<Object>List<? super Number>List<Number>List<Integer>List<? extends Number>,我想了解他們的層次結構。此Java輸入層次結構是否正確?

我知道List<Integer>不是List<Number>一個亞型,即使Integer確實是Number一個亞型,所以我認爲這是代替List<? extends Number>亞型。

List<? extends Number>直覺似乎是List<Number>一個亞型,這使得List<Integer>的畢竟List<Number>的後裔,因爲我對它的想法表示:

enter image description here

所以,如果一個類型是從另一個後裔,但不是直接的,它仍然是它的祖先的一個子類型(或者我在圖中只是錯誤的)?這個練習也讓我對?Object有點困惑......實際上,它看起來像我可能有List<Object>List<? super Number>混合起來。我想最大的問題之一是,「是'所有'是Object ......還是一切都是??」或者兩者兼得......或者兩者都不?

+3

大多數你圖的是不正確,除非'列表 - >列表'意味着'V是U'的子類型。例如'列表'不是'列表'的子類型 - 例如參見:http://stackoverflow.com/questions/2745265/is-listdog-a-subclass-of-listanimal-why-arent-javas-泛型 - 隱式 – assylias

回答

2

原因爲什麼List<Integer>不是List<Number>的子類型。

讓我們考慮一個場景,其中List<Number>接受List<Integer>(這實際上不會工作)。

List<Integer> listI =new ArrayList<Integer>(); 
    List<Double> listD = new ArrayList<Double>(); 
    method(listI); 
    method(listD); 

並且您有一個以List<Number>作爲參數的方法。

public void method(List<Number> list) { 
    list.add(new Double()); // would fail if you pass an List<Integer> as Integer is not a super type of Integer. 
    list.add(new Integer()); //would fail if you pass an List<Double> as Double is not a subtype of Integer  
    }  

所以如果聲明List<number>你的方法參數接受List<Double>並嘗試添加一個整數到雙。其中是錯誤的列表,因爲不是一個超類型整數因此List<Number>不是子類型List<Integer>

現在考慮同樣的場景,其中List<? extends Number>是一個方法參數,而不是List<Number>

  public void method(List<? extends Number> list) { 
         // list.add(new Double()); 
         // list.add(new Integer());  
       } 

,現在你傳遞一個List<Integer>此方法。如果它接受它並且您嘗試將Double添加到整數列表BOOM ...您剛剛添加了一個Double整數列表

給出非正式示例。考慮動物超型與作爲亞型。 現在,您有一種方法接受<? extends Animal>並且您將Dog傳遞給此方法。並在該方法中嘗試添加Cat。它加入了錯誤類型(CAT)到您的,從而**List<Dog>**不是List<? extends Animal>

亞型請讓我知道這是不是表現enough.Thanks :)

+0

因此,需要注意的是任何允許爭論進入的內容可能與其他內容不兼容? – nicole

+0

不,參數是兼容的,如果它不是你會得到一個編譯時錯誤,你應該注意的情況下,像添加一個貓到一個作爲參數傳遞的狗列表的情況。在這裏你的論點會接受狗或貓,因爲它們都是動物,但你應該小心在方法內部添加錯誤的東西。 – PermGenError