2015-06-02 46 views
0

我有一個初始化爲HashMap,例如)的控制器。我怎麼能在通用宣言中使用的HashMap的K和V如何在方法聲明中使用泛型

public static void testMyMethods(Class k, Class v) { 
    // Tried the below code, but it is having compile time issues 
    HashMap < k.getClass(), v.getClass() > hm = new HashMap < k.getClass(), k.getClass() >(); 
} 
+3

類型的仿製藥已經在編譯時得到任何好處被稱爲在他們之外。它們在運行時不存在,因此做你正在做的事情是沒有意義的。 – Sinkingpoint

+0

@Quirliom:好的,我們可以通過其他方式實現這一目標嗎? –

+0

通用不需要創建一個HashMap,所以你可以使用原始類型。 –

回答

1

由於Class<?>是一個泛型類型,以及,你可以使用:

public static <K,V> void testMyMethods(Class<K> k, Class<V> v) { 
    Map<K, V> hm = new HashMap<>(); 
    ... 
} 

但只要你不使用kv,你不需要提供它們中的任何一個:

public static <K, V> void testMyMethods() { 
    Map<K, V> hm = new HashMap<>(); 
    ... 
} 

我在聲明中將HashMap更改爲Map,請參閱Effective Java - Item 52以獲得解釋。

而且我用的鑽石運營商<>,這是可以從Java 7

+0

非常有幫助Sir :) –

+0

非常感謝,您提出了一個非常關鍵的問題:) –

+0

如果參數或返回類型中沒有顯示'K'和'V',那就沒有意義了。 – newacct

-1

在Java 7,您可以使用鑽石操作這樣

HashMap< ?, ? > hm = new HashMap <>(); 

?表示未定義的類型。

,如果你真的不知道你的類型則是不需要告訴java關於它們的類型,你可以聲明這樣

Map hm = new HashMap <>(); 
+1

如果您使用通配符 –

+0

,我不認爲我們可以在此散列表中添加任何東西yes是通配符類型,但我的要求有點不同。:) –

+0

@ Pham問題是關於聲明所以有我的解決方案。但如果有人真的不知道類型,那麼他們不需要告訴Java他們的類型,並使用沒有類型的HashMap。我已經更新了我的回答,回答你的問題:) –