2009-09-01 116 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

相关问题