2009-09-01 12 views
0

地図私は2つの入力のマップ間の値の一方的な交差点を返す関数を持っている:マップ全体の一般的なキーイング:地図<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 

この関数は、署名が次のように一般的になる方法はありますか?

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

+0

まあ、Javaジェネリックに関する苦情はほとんど読んだことがあります。この文法の不規則性は私にも理由を与えます。私がしようとしていた: MPaに mergeMaps (地図<...>、地図<...>) おかげで多くを! – pbh101

+0

ええ、あなたはクラスの最初か定義しているジェネリックパラメータを定義しなければなりません。私は、Javaのジェネリックスの実装も完璧ではないことに同意しますが、時にはきれいです。 – Daff

3

はあなたが持つことができる

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

KとVがクラスに設定されている場合のことができます。それらを取り出してください。あなたがTとKの関係を指定したい場合のために

、あなたはそこにいくつかの? extends? superと多分

よう
public <K, V, T extends CompositeKey<K, V>> ... 

何かをしたい場合がありますVが、それは、使用に少し依存場合。

+0

ありがとう! CompositeKeyは、実際には順序付けされたコレクションとhashcode()オーバーライドのラッパーです。ここでは、複合キーを本質的にドメインをある表現(社内ソフトウェア)から別の(サードパーティ)表現にマッピングするための主キーとして使用していました。したがって、CompositeKey/Tは、この場合、KとVを整列させるための一時的な接着剤にすぎません。 – pbh101

関連する問題