2016-03-14 41 views
2

我有兩個枚舉:如何在Java中編寫一個函數來推廣使用具有不同鍵類型的映射參數?

enum Country { US, etc } 
enum Language { EN, etc } 

我希望能夠寫一個函數,它在地圖中有兩種枚舉的關鍵:

checkMap(new HashMap<Language, Long>()); 
checkMap(new HashMap<Country, Long>()); 

我已想出的唯一辦法如何做到這一點有以下幾種:

1. private void checkMap(Map<? extends Enum, Long> mapParam) {...} 

2. private <T> void checkMap(Map<T, Long> mapParam) {...} 

3. private void checkMap(Map mapParam) {...} 

這些都不是對我讓在參數超級特定的(1)做最好通過使枚舉的一些子類,但是很多邏輯複雜化(我在這裏大大簡化了)。 (3)我必須做大量的下游鑄造,而且我覺得這只是一個普遍不好的做法。

我覺得我錯過了一些相當明顯的東西。

我也知道我可以用不同的參數編寫兩個單獨的方法聲明,但是有太多重複的邏輯,我想將該邏輯抽象爲函數並避免重複的代碼。

+3

有兩類完全不相關的,所以你要與要概括的鬥爭邏輯。你可以提供一個例子,說明'checkMap'如何在這兩個不相關的類中統一應用邏輯? –

+0

僅僅因爲你有兩種不同的方法並不意味着你必須重複邏輯。只是使用私人幫手的方法來處理常見的東西。 –

回答

1

我使用你的選項2:使用通用類型參數T。在你的例子中,方法是private,所以你可以完全控制哪些方法可以委託給checkMap,所以不需要擔心使用不合適的密鑰類型的委託。

0

您可以使用一個接口 - 使國家和語言實現一些虛構的接口,並在方法聲明中使用它:

interface Dummy{} 
enum Country implements Dummy {...} 
enum Language implements Dummy {...} 

private checkMap(Map<Dummy, Long> map) {...} 
相關問題