2012-09-14 73 views
2

Class<List>Class<List<?>>Class<List<Anything>實際上是指相同的Class如何正確加載實現參數化接口的類?

但是如果我有

class MyClass implements List<SomeClass> { 
    // ... 
} 

然後我可以寫

Class<? extends List<SomeClass>> myClass = MyClass.class; 

那麼這將讓我寫

List<SomeClass> myInstance = myClass.newInstance(); 

訣竅是,我想加載此通過反射使用ClassLoader.loadClass並且仍然聲明​​myClass具有相同的類型。什麼是正確/最簡單的方法來做到這一點?

我想要一個解決方案,不會引發編譯警告,並且不需要@SuppressWarnings(這可能意味着需要運行時檢查超級類型,如更強大的版本Class.asSubclass)。

+0

可能是一樣的:http://stackoverflow.com/questions/356583/can-i-reflectively-instantiate-a-generic-type-in​​-java – zeller

+0

事實上,它似乎是同樣的問題...沒有一般的回答:( –

+0

所以你有這樣的要求,只是因爲你不喜歡壓制警告,或者你需要防彈型檢查? –

回答

2
public Class<?> loadClass(String name) throws ClassNotFoundException 

因爲它返回Class<?>通用類,your type information is lost here。所以你將不得不對所需的類型進行類型轉換。

+0

正如我在下面的評論中所說的,類型信息仍然存在,在運行時很難檢查它,並且避免警告。通過使用'Class.asSubclass'避免類型轉換(它也執行運行時檢查),但它不適用於泛型。 –

0

當您編譯具有泛型簽名的類時,所有關於泛型的信息都將丟失。對於JVM,它一樣好:

class MyClass implements List { 
    // ... 
} 

你可以,如果你編譯一個類與javap檢查:你會看到沒有通用的東西在那裏。泛型主要用於編譯時檢查。所以當你用反射來加載一個類時,你必須把它轉換爲你的通用版本。

+0

T他是一個錯誤的信念,只有部分通用信息丟失,但是編譯相關類所需的所有內容都保留下來。如果你使用'MyClass.class.getGenericInterfaces()',你將能夠看到完整的'List '。 –

+0

@DidierL:哦,對不起,我不知道那些方法。 –

相關問題