2011-02-27 62 views
3

增益訪問我有下面的代碼:Java泛型 - 以參數

class iCache<K,V> implements Map<Object, Object> 
{ 
...//Code 
} 

如何,我可以得到K和V的類名?

回答

3

如果擴展iCache並希望獲得類型確定參數,你用來聲明子類(如以下):

class someCache extends iCache<Integer,Long> { 
//... 
} 

可以使用找出在運行時這些參數如下(source):

Class clazz = ((ParameterizedType) getClass() 
         .getGenericSuperclass()).getActualTypeArguments()[0]; 

如果你在實例化這樣

iCache<Integer,Long> cache = new iCache<Integer,Long>(); 
提供的參數3210

然後你運氣不好(more info)。

+0

我的問題是,如果我有 'ICACHE <整數,整數>緩存=新ICACHE <整數,整數>(20);' 我可以把一切如 'cache.put(0,「測試「);' 我真的不知道如何解決這個問題。 – ExiRe 2011-02-27 18:40:54

+3

@ExR:你需要實現'Map '而不是'Map '! – 2011-02-27 19:04:15

7

不能,編譯器在編譯時執行類型擦除。換句話說,K和V型參數純粹是編譯時概念,它們在運行時不可訪問。

你可以做的是在運行時抓取自定義Map類型中的鍵/值的類。

+3

值得關注的是在運行時類鍵/值可以是從實際的參數不同的的getClass()方法(它可以是K和V的亞類)。 – adamax 2011-02-27 18:16:57

5

你不能。 Java泛型不能以這種方式工作。在運行時,沒有可用的類特定信息(這被稱爲erasure)。如果您真的需要這些信息,您必須通過例如Class對象。

2

這些類型將被刪除。將Class和Class作爲參數傳入構造函數以傳遞原始類型。存儲爲字段。注意:無論如何,你的patameterisation是不好的:你需要將K和V傳遞給Map,否則你會給自己更多的痛苦。

0

事實上可以,則調用鍵和值