2009-09-01 120 views
0

我有返回值的兩個輸入地圖之間單面相交的函數:通用鍵控:從地圖<T,K>地圖<K,V>和地圖<T,V>

Map<Key, Value> mergeMaps(Map aKeys<CompositeKey, Key>, 
     Map <CompositeKey, Value> aValues) { 

    Map<Key, Value> myResult = Maps.newHashMap(); 
    for (CompositeKey myKey : aKeys.keySet()) { 
     if (aValues.containsKey(myKey)) { 
      myResult.put(aKeys.get(myKey), aValues.get(myKey)); 
     } 
    } 
    return myResult; 
} 

的傳遞映射組合物即

T->K, K->V ===> T->V 

而是轉化

T->(K,V) ===> K->V 

有沒有在Java中使這個函數通用的方式,使其簽名如下?

Map<K, V> mergeMaps(Map aKeys<T, K>, Map <T, V> aValues) 

回答

4

我覺得這個簽名應該做你想要什麼:

<T, K, V> Map<K, V> mergeMaps(Map<T, K> aKeys, Map<T, V> aValues) 
+0

尚未編譯,但IntelliJ停止抱怨:) – pbh101 2009-09-01 22:53:45

+0

嗯,我幾乎只讀過關於Java泛型的投訴。這種語法不規則性也給我一個理由。我試圖: Mpa mergeMaps (地圖<...>,地圖<...>) 非常感謝! – pbh101 2009-09-01 22:56:11

+0

嗯,您必須在開始階段或定義階級中定義泛型參數。我同意在Java中泛型的實現也不完美,但有時它非常整齊。 – Daff 2009-09-01 23:10:14

3

對於一個完全通用的形式,你可以有

public <T, K, V> Map<K, V> mergeMaps(Map<T, K> aKeys, Map<T, V> aValues) 

如果K和V類中的設置,你可以帶他們出去。

對於要指定T和K的關係的情況下,V你可能想要的東西 像

public <K, V, T extends CompositeKey<K, V>> ... 
一些 ? extends? super在那裏

可能,但是這取決於使用位案件。

+0

非常感謝! CompositeKey實際上是一個有序集合和hashcode()覆蓋的包裝。在這裏,我將複合鍵本質上用作將一個表示(內部軟件)映射到另一個表面(第三方)的主鍵。因此,在這種情況下,CompositeKey/T只是暫時粘合K和V對齊。 – pbh101 2009-09-02 00:41:15

相關問題