簡體   English   中英

為什么List.toArray()不通用?

[英]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://ideone.com/3nX0cz


更新:好的,我相信這是答案:

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()] ,這可能導致鏈接出現問題。回來。 有人試圖按照這些思路給出答案,但此答案已被刪除,因此我忘記了它是誰。

該方法應該創建一個新的數組。 但是,如果您沒有TClass信息,您將無法做到這一點。

你不能說T[] array = new T[list.size()];

如果將數組作為參數傳遞(就像在其他方法中一樣),則沒有問題。

完整的答案是:因為toArray()的實現無法構造T[]數組,所以它應該在沒有“示例”數組的情況下返回給您。 查看AbstractCollectiontoArray( T[] )的泛型重載的源代碼,以了解不同之處。

他們也可以使用Class< T >參數來實現。 但是,至少可以使用示例來自己分配空間(而且對於通用類型G< S >幾乎不可能生成Class< G< S > >的實例)。

由於Java中泛型的性質。 由於擦除,在運行時沒有類型信息可用,因此no-arg版本只能返回Object數組。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM