2010-12-13 59 views
2

另一個我如何做toArray()沒有警告問題,但它不同於這裏發佈的大多數。擺脫列表中的警告<GenericClass <T>> .toArray()

如何重寫方法實現(不更改方法簽名)以使其在沒有警告的情況下編譯?

這裏顯然的困難是T的類信息在運行時不可用。但是,返回類型在運行時也是擦除類型,所以沒有理由不能這樣做。那麼,如果要執行編譯時類型安全性,我該如何做到這一點?

謝謝

<T> GenericClass<T>[] toGenericArray(List<GenericClass<T>> list) { 
    return list.toArray(new GenericClass[0]); 
} 
+0

Java爲什麼很愚蠢的一個完美例子= P – Falmarri 2010-12-13 23:23:59

+6

@Falmarri:更準確地說,Java中一些愚蠢的例子。它確實很好,還有一些錯誤。我同意刪除是愚蠢的,但從這個概括推廣是不公平的。 – 2010-12-13 23:28:59

回答

1

你不能。因爲數組是協變的,所以對於擁有參數化類型的數組來說編譯時安全是不可能的。 (?除非你使用<>這是合法的。)

這將永遠是合法的:

GenericClass<String>[] array = new GenericClass[1]; 
Object[] brokenArray = array; 
brokenArray[0] = new GenericClass<Integer>(); 
String value = array[0].getGenericValue(); //kaboom 

編譯器是無法保護你免受這一點,所以它迫使你承認/抑制,有一個警告。

+0

提及Java的數組是協變的。事實上(參見我的後續問題)。無論如何/任何情況下可以創建一個通用數組(直接或間接),併發出警告?絕對不應該,對吧?鑑於這一事實,始終可以創建完全合法的代碼,在「錯誤」行處生成ClassCastException? – RAY 2010-12-14 01:32:03

1

您可以添加一個@SuppressWarnings("unchecked")註釋。這不會更改方法簽名,並且可以在不產生警告的情況下執行「不安全」的事情。你的代碼是真正安全的,所以可以壓制警告。請注意,根據@ Affe的回答,在您返回後可能會發生錯誤,但您可以正確實施您的方法。

Java集合框架在內部完成這種工作,所以它不僅僅是一種破解。那麼,它的黑客,但它是一個好的黑客。那麼,這不是那麼好,但它的工作原理。均田。