2010-03-26 176 views
3

我想知道是否有在Java中這樣做(除了明顯的一個優雅的解決方案的基礎 - 聲明不同的/顯函數的下面是代碼:Java泛型參數與泛型參數

private static HashMap<String, Integer> nameStringIndexMap 
     = new HashMap<String, Integer>(); 
private static HashMap<Buffer, Integer> nameBufferIndexMap 
     = new HashMap<Buffer, Integer>(); 

// and a function 
private static String newName(Object object, 
     HashMap<Object, Integer> nameIndexMap){ 
    .... 
} 

的問題是,我無法通過nameStringIndexMapnameBufferIndexMap參數的功能。我沒有這樣做,其中明確想要一個的HashMap <字符串另一功能旁邊一個更優雅的解決方案的想法,整數>HashMap < Buffer,Integer >參數。

我的問題是: 這可以在一個更優雅的解決方案/使用泛型或類似的東西?

謝謝

尤利安

+0

我不明白你的目標是在這裏。你想複製你的緩衝區newName方法嗎? – Riduidel 2010-03-26 09:37:25

+0

我想爲這兩種類型使用相同的功能。這是我想要實現的。下面有一些答案幫助我做到這一點 – INS 2010-03-26 09:42:22

回答

4

你可以讓你的函數通用太:

private static <E extends Object> String newName(E object, 
     HashMap<E, Integer> nameIndexMap){ 
    .... 
} 

此函數的兩個參數界定在一起,所以一個HashMap<String, Integer>您只能通過String實例作爲第一個參數。這可能是也可能不是你想要的:如果你只想從地圖獲取元素,喬恩的解決方案更簡單,但如果你想將這個對象添加到地圖,這是唯一的選擇。

+0

這正是我想要的。非常感謝 – INS 2010-03-26 09:46:55

+0

@newacct ???在我的計數,它使用兩次... – 2010-03-26 10:25:38

3

你想是這樣的:

private static String newName(Object object, 
     HashMap<? extends Object, Integer> nameIndexMap) { 
    .... 
} 

或(在評論中指出)

private static String newName(Object object, 
     HashMap<?, Integer> nameIndexMap) { 
    .... 
} 

這將阻止你把任何東西納入的地圖,be因爲你不能保證獲得關鍵的權利 - 但你可以得到的地圖的地圖,並保證它們將是整數。

請注意,此版本不使該方法一般 - 這意味着它的簡單,但它提供相同類型安全彼得的版本呢,你不能保證object是的正確的類型。每種方法都有其優點和缺點 - 根據方法的主體使用最合適的方法。 (如果你需要把一個進入地圖,彼得的做法肯定是更好了。)

+0

當然,「擴展對象」部分是可選的 – newacct 2010-03-26 09:37:36

+0

@newacct:True。我會補充一點。 – 2010-03-26 09:38:53

+0

這是一個很好的答案,但符合我的目的的答案不是這一個。無論如何謝謝你的回答 – INS 2010-03-26 09:45:58