2010-01-20 108 views
1

假設我想要寫的函數,其將創建從一些指定類型T爲String一個HashMap,例如從整數到字符串一個HashMap如下:問題,使用Java反射

HashMap<Integer, String> myHashMay = new HashMap<Integer, String>();

我想擁有的flexibilty指定類型T.所以我寫一個函數:

void foo(Class<?> myClass) { 
    HashMap<myClass, String> myHashMay = new HashMap<myClass, String>(); 
    ....... 
} 

所以,如果我調用FOO(Integer.class),整數到字符串一個HashMap將創建在這個函數裏面。顯然上面的foo函數甚至沒有編譯。任何人都可以給我一些關於如何用給定的函數簽名來正確編寫這樣一個函數的提示。

謝謝,

+1

我覺得強制要注意的是,如果你用反射實例化一個對象,那麼在編譯時就沒有類型信息,所以你必須做一個未經檢查的強制轉換。換句話說,你不能用反射來實例化一個HashMap ,只是一個HashMap。 – 2010-01-21 00:17:54

回答

2
<T> void foo(Class<T> myClass) { 
    HashMap<T, String> myHashMay = new HashMap<T, String>(); 
    ... 
} 

編輯: 然而,方法與這樣的簽名似乎並不是非常有用的,因爲T被僅用於類型在編譯時檢查。我可以想像,當它只能使用單一的場景:

<T> void foo(Class<T> myClass) { 
    HashMap<T, String> myHashMay = new HashMap<T, String>(); 
    ... 
    try { 
     T key = myClass.newInstance(); 
     myHashMay.put(key, "Value"); 
    } catch (Exception ex) { ... } 
    ... 
} 
1

該函數創建一個地圖就像你正在嘗試做的:

public <KeyType> Map<KeyType,String> createMapWithKeyType(Class<KeyType> keyType) 
{ 
    return new HashMap<KeyType, String>(); 
} 

注:注意馬特B上的評論,他說得很好。

+0

謝謝你們的答案和評論。他們非常有幫助。由於我使用的是第三方代碼,爲了讓我的代碼正常工作,我必須採用這種方法。 – RecSys2009 2010-01-22 15:10:00