[英]Why isn't List.toArray() generic?
為什么List.toArray()不通用? 為什么必須將類型作為參數(通常創建一個新的空實例)?
public Object[] toArray()
http://docs.oracle.com/javase/7/docs/api/java/util/List.html#toArray()
更新:從那以后,我了解到不允許創建通用數組,但我認為應該這樣做。 有什么理由不允許這樣做?
Main.java:28: error: generic array creation
T[] ret = new T[size()];
更新:好的,我相信這是答案:
http://docs.oracle.com/javase/tutorial/java/generics/restrictions.html#createArrays
不是因為它直接相關,而是間接相關。 new T[size()]
本質上沒有什么錯,其中MyList<String>
將變成new String[size()]
,但是T本身可以是參數化類型。 因此,如果要創建MyList<Set<Integer>>
,則T
等於Set<Integer>
,編譯器將嘗試創建new Set<Integer>[size()]
,這可能導致鏈接出現問題。回來。 有人試圖按照這些思路給出答案,但此答案已被刪除,因此我忘記了它是誰。
該方法應該創建一個新的數組。 但是,如果您沒有T
的Class
信息,您將無法做到這一點。
你不能說T[] array = new T[list.size()];
如果將數組作為參數傳遞(就像在其他方法中一樣),則沒有問題。
完整的答案是:因為toArray()
的實現無法構造T[]
數組,所以它應該在沒有“示例”數組的情況下返回給您。 查看AbstractCollection
中toArray( T[] )
的泛型重載的源代碼,以了解不同之處。
他們也可以使用Class< T >
參數來實現。 但是,至少可以使用示例來自己分配空間(而且對於通用類型G< S >
幾乎不可能生成Class< G< S > >
的實例)。
由於Java中泛型的性質。 由於擦除,在運行時沒有類型信息可用,因此no-arg版本只能返回Object數組。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.