2012-04-03 157 views
10

我有兩個問題,actaully ... 首先,爲什麼不能我這樣做:列表<Object>和列表<?>

List<Object> object = new List<Object>(); 

第二,我有一個返回List<?>的方法,我將如何轉那到一個List<Object>,我可以簡單地施放它嗎?

謝謝!

+0

好的,如果你們說'List '不能被實例化,那麼它是如何返回它的? – Chris 2012-04-03 06:50:33

+0

值得注意的是'Arrays.asList(T ... a)'返回'List '。您可以使用列表來初始化'List'列表 li = Arrays.asList(1,2,「3」);'保存一些輸入,儘管返回的List將固定大小並由數組支持:https: //docs.oracle.com/javase/7/docs/api/java/util/Arrays.html#asList (T ... – 2015-09-01 04:33:42

回答

28

爲什麼不能我這樣做:

List<Object> object = new List<Object>(); 

你不能這樣做,因爲List是一個接口,而接口不能被實例化。只有(具體)類可以。實施List具體類的實例包括ArrayListLinkedList

這是怎麼一會創建ArrayList一個實例:

List<Object> object = new ArrayList<Object>(); 

我有一個返回List<?>的方法,我將如何把這一成List<Object>

告訴我們相關的代碼,我會更新答案。

+0

)返回'List '的方法來自外部庫,我無法獲取我只知道它曾經返回一個'List ',然後他們更新了代碼,現在它返回一個'List ',基本上打破了我所有的編碼。 – Chris 2012-04-03 06:42:05

+0

答案沒有充分解決第二部分問題:一個例子呢? – 2015-06-26 14:10:13

4
List<Object> object = new List<Object>(); 

你不能這樣做,因爲列表是一個接口,你不能創建任何接口的對象或者換句話說,你不能實例化任何接口。此外,您可以將實現列表的任何類的對象分配給其引用變量。例如,你可以這樣做:

list<Object> object = new ArrayList<Object>(); 

這裏的ArrayList是實現列表,您可以用它實現列表任何類的類。

2

列表是一個接口,所以你不能實例化它。使用它的任何實現,例如

List<Object> object = new List<Object>(); 

關於列表: 你可以使用任何對象作爲一個通用的參數有關它的實例:

List<?> list = new ArrayList<String>(); 

List<?> list = new ArrayList<Integer>(); 

在使用List<Object>這個聲明是無效的,因爲這將是類型錯配。

0

要回答你的第二個問題,是的,你可以施放List<?>List<Object>或任何類型的List<T>,因爲?(通配符)參數指示列表中包含的任何Object的均勻集合。但是,在編譯時無法知道type是什麼,因爲它只是導出的API的一部分 - 這意味着您看不到List<?>中插入的內容。

這裏是你將如何做演員:

List<?> wildcardList = methodThatReturnsWildcardList(); 
// generates Unchecked cast compiler warning 
List<Object> objectReference = (List<Object>)wildcardList; 

在這種情況下,你可以忽略警告,因爲爲了在泛型類中使用的對象時,它必須是一個Object亞型。假設我們試圖將其作爲List<Integer>,當它實際上包含String s的集合時。

// this code will compile safely 
List<?> wildcardList = methodThatReturnsWildcardList(); 
List<Integer> integerReference = (List<Integer>)wildcardList; 

// this line will throw an invalid cast exception for any type other than Integer 
Integer myInteger = integerRefence.get(0); 

記住:泛型類型在運行時被擦除。你不會知道集合包含什麼,但是你可以得到一個元素並且調用.getClass()來確定它的類型。

Class objectClass = wildcardList.get(0).getClass();