2013-09-21 258 views
4

這兩個List s有區別嗎?List <Something>和List <?有什麼區別?擴展Something>?

List<Something> a; 
List<? extends Something> b; 

我知道,例如

List<Object> a; 
List<?> b; 
List c; 

List<Something> a; 
List<? extends SomeInterfaceSomethingImplements> b; 

都是不同的,但這些怎麼樣?如果Something被替換爲Object,它會不同嗎?

List<Object> a; 
List<? extends Object> b; 
+0

請參閱:http://stackoverflow.com/questions/897935/when-do-java-generics-require-extends-t-instead-of-t-and-is-there-any-down –

+0

Makind類型一個字段'列表'只允許你爲它分配一個'List '。由於類型擦除,「列表」不被視爲「列表」。聲明爲List <的引用? extends Object>'可以被賦予一個屬於Object的任意子類的元素列表(對Java中的所有類都適用)。這可能意味着'清單','清單','清單' – toniedzwiedz

+0

@Tom對,除了我很確定這不是因爲類型擦除。 'String'和'Object'已經存在,它們只是被檢查,它與擦除類型無關。 – Dukeling

回答

8

List<Something>Something類型的對象的列表。 List<? extends Something>是延伸Something的某些特定類型的對象的列表。

因此,List<Object>可以有任何類別的對象,延伸Object。 但List<? extends Object>只能被初始化爲或指定爲特定類的對象的列表,其可以延伸Object

這是有用的嗎?假設你要編寫需要的Objects一個List並打印每個項目的方法:

void print(List<Object> list) { 
    for (Object obj: list) { 
     System.out.println(obj) 
    } 
} 

現在,讓我們說你有一個List<Integer>。您無法將它傳遞給上述方法,因爲print需要List<Object>,並且List<Integer>不能分配給List<Object>。爲了解決這個問題,我們重新定義print爲:

void print2(List<? extends Object> list) { 
    for (Object obj: list) { 
     System.out.println(obj) 
    } 
} 

現在,我們可以通過列出對象的任何子類的來print2print2將接受List<Integer>List<String>

在另一面,你不能在列表中添加任何東西里面print2,因爲print2不知道所使用的Object的具體亞型。因此,您只能在不需要向List添加任何內容的方法中使用? extends ...

+0

'List <?擴展Object>'也可以初始化爲'List '。 – Ryan

+0

@瑞恩,是的,它可以。 '?'的用處在於它也可以分配給'List ',而您不能將'List '分配給'List ' –

+0

爲什麼選擇down-vote? –

1

List<Something>表示執行應該是類似於ArrayList<Something>。但另一種情況List<? extends Something>意味着實現可以是任何類似於ArrayList<Something>ArrayList<SomethingChild>其中SomethingChild延伸Something

您可以指定

List<? extends Something> list = new ArrayList<SomethingChild>(); 

,而不能分配

List<Something> list = new ArrayList<SomethingChild>(); 

這將導致編譯錯誤。

您可以瞭解更多關於泛型用於獲取一些真知灼見

2

正如其他人所說泛型和通配符,List<Something>Something類型的對象的列表,而List<? extends Something>將被初始化爲不同的列表對象類型,只要對象類型延伸Something

List<Object>將是Object類型的對象列表。

List<? extends Object>可能被初始化爲擴展爲Object的任何數據類型的列表。

這裏是在使用Object相比? extends Object時會發生什麼一些代碼:

import java.util.ArrayList; 

public class test { 
    class A {} 

    public static void main(String[] args) { 
     // No error 
     ArrayList<Object> arrObj = new ArrayList<Object>(); 

     // Error 
     ArrayList<Object> arrObj2 = new ArrayList<A>(); 

     // No Error 
     ArrayList<? extends Object> arrExt = new ArrayList<Object>(); 

     // No Error 
     ArrayList<? extends Object> arrExt2 = new ArrayList<A>(); 
    } 

} 
0

首先就是對象類型收集的東西,第二個是,是某種亞型對象的集合。

相關問題