我有兩個問題,actaully ... 首先,爲什麼不能我這樣做:列表<Object>和列表<?>
List<Object> object = new List<Object>();
第二,我有一個返回List<?>
的方法,我將如何轉那到一個List<Object>
,我可以簡單地施放它嗎?
謝謝!
我有兩個問題,actaully ... 首先,爲什麼不能我這樣做:列表<Object>和列表<?>
List<Object> object = new List<Object>();
第二,我有一個返回List<?>
的方法,我將如何轉那到一個List<Object>
,我可以簡單地施放它嗎?
謝謝!
爲什麼不能我這樣做:
List<Object> object = new List<Object>();
你不能這樣做,因爲List
是一個接口,而接口不能被實例化。只有(具體)類可以。實施List
具體類的實例包括ArrayList
,LinkedList
等
這是怎麼一會創建ArrayList
一個實例:
List<Object> object = new ArrayList<Object>();
我有一個返回
List<?>
的方法,我將如何把這一成List<Object>
告訴我們相關的代碼,我會更新答案。
)返回'List >'的方法來自外部庫,我無法獲取我只知道它曾經返回一個'List
答案沒有充分解決第二部分問題:一個例子呢? – 2015-06-26 14:10:13
List<Object> object = new List<Object>();
你不能這樣做,因爲列表是一個接口,你不能創建任何接口的對象或者換句話說,你不能實例化任何接口。此外,您可以將實現列表的任何類的對象分配給其引用變量。例如,你可以這樣做:
list<Object> object = new ArrayList<Object>();
這裏的ArrayList是實現列表,您可以用它實現列表任何類的類。
列表是一個接口,所以你不能實例化它。使用它的任何實現,例如
List<Object> object = new List<Object>();
關於列表: 你可以使用任何對象作爲一個通用的參數有關它的實例:
List<?> list = new ArrayList<String>();
或
List<?> list = new ArrayList<Integer>();
在使用List<Object>
這個聲明是無效的,因爲這將是類型錯配。
要回答你的第二個問題,是的,你可以施放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();
好的,如果你們說'List >'不能被實例化,那麼它是如何返回它的? – Chris 2012-04-03 06:50:33
值得注意的是'Arrays.asList(T ... a)'返回'List'。您可以使用列表來初始化'List'列表