2013-09-30 47 views
0

我試圖使用一個泛型類型給我的方法作爲給定的數據結構的類型,類似於函數中的映射,但在聲明上只使用一個類。它更像是一個帶有鍵的ArrayList。所以,我試圖做的是:Polymorphic Datastructures Java

private final ArrayList<T extends Object> findGroup(final String key, final String classType) 
{ 
    Class<?> c = Class.forName(classType); 
    ArrayList<c.class> listOfStuff = new ArrayList<>(); 

    return listOfStuff; 
} 

我得到的錯誤發生在.class調用。 我已經嘗試過c.getClass(),以及從c.class創建另一個Class對象來查看它是否工作,但無法使它工作。

這是否有一些首選的方法?

是的,我知道一些這往往是有點加工沉重,但我需要它爲我正在做的。

+0

爲什麼不傳遞'Class'對象作爲參數而不是'String'? – helpermethod

+0

由於類型擦除,那實際上不會做任何事情。 – SLaks

+0

_但我需要它爲我正在做什麼._究竟是什麼? –

回答

6

如果該類對象本身在編譯時是已知的,這是可以做到如下:

private final <T> List<T> findGroup(final String key, final Class<T> type) 
{ 
    ArrayList<T> listOfStuff = new ArrayList<T>(); 

    // TODO: fill listOfStuff here (e.g. using key and type) 

    return listOfStuff; 
} 

如果你有基於一個String運行時加載的類,它是沒有意義在這裏使用泛型,因爲調用findGroup的方法在編譯時本身並不知道List的實際類型。因此,您只能將findGroup的結果分配給List<?>。那麼爲什麼要使用泛型呢? (請注意,在java中,泛型主要用於確保編譯時的類型安全性。在運行時,List<String>List<Integer>之間沒有區別,因爲在編譯代碼時類型信息被擦除)。

+0

只是想知道,類型變量似乎並沒有在你的代碼中使用。你的意思是使用它嗎?這個解決方案似乎工作得更好,我只是想弄清楚你添加的那部分。 –

+1

事實上,你不需要type參數來創建ArrayList,但我認爲該方法不僅僅是創建一個集合,而且需要它的實際類型。由於泛型類型參數被擦除且在運行時不可用,因此您需要一個「真實」參數。 – isnot2bad

+0

這就是它所服務的全部目的,所以我會把它拿出來。感謝您的幫助。 –

1

Type erasure會阻止這樣的事情發揮作用。基本上,你不能初始化只有在運行時才知道的泛型,因爲JVM不瞭解泛型。因此,類型必須在編譯時可用。