2008-11-17 138 views
2

我仍然試圖讓我的頭在使用Java的泛型。我使用類型化的集合完全沒有問題,但其餘大部分內容似乎都讓我難以理解。將Class []轉換爲泛型?

現在我正在嘗試使用JUnit「PrivateAccessor」,它需要一個Class []參數,併爲所調用的私有方法提供所有參數類型的列表。在Java 1.4中,我定義爲

Class[] args = new Class[] { Collection.class, ArrayList.class }; 

但實際的代碼被定義爲現在接受的參數

myMethod(Collection<MyClass1> first, ArrayList<MyClass2> second) 

我試圖改變args來定義要

Class<? extends Object>[] args = new Class<? extends Object>[] 
{ Collection<MyClass1>.class, ArrayList<MyClass2>.class }; 

但是Eclipse在收盤>上放了一個紅色標記,並表示它在那個時候期待「無效」。我可以用泛型做到這一點,還是不應該打擾?

回答

6

你的第一個問題是,你應該使用

Class<?>[] args = new Class[] 

代替

Class<? extends Object>[] args = new Class<? extends Object>[] 

This解釋了原因。

你的第二個問題是,你應該使用

{ Collection.class, ArrayList.class }; 

,而不是

{ Collection<MyClass1>.class, ArrayList<MyClass2>.class }; 

這是因爲XXX.class是在運行時進行評估,之後type erasure已經執行,所以指定類型論點是無用的,因此被禁止。

我強烈推薦使用FAQ,我已將上述兩個解釋鏈接起來,用於闡明大多數問題的「泛型」Java泛型。

2

這是正確的語法:

Class<?>[] paramTypes = new Class[]{ Collection.class, ArrayList.class }; 
2

有關爲什麼不允許創建具體參數化類型的數組的更多說明,您可能需要閱讀Angelika's FAQ

yc

+0

只是注意到我雙重鏈接bdumitriu引用到的鏈接。但是這個會讓你直接知道我們所處的主題。 – yclian 2008-11-18 00:13:37