Google Guava函数用于从Map.Entry中提取密钥

时间:2013-02-09 04:50:13

标签: java casting

我想要这样的东西(Java):

class MapEntries {

    private static final Function<Map.Entry<Object, Object>, Object> EXTRACT_KEY =
        new Function<Map.Entry<Object, Object>, Object>() {
          @Override
          public Object apply(Map.Entry<Object, Object> input) {
              return input.getKey();
          }
    }

    public static <K, V> Function<Map.Entry<K, V>, K> extractKey() {
        return EXTRACT_KEY;
    }
}

请注意,EXTRACT_KEY是单身,extractKey()使用泛型来保证类型安全。

不幸的是,当我写return EXTRACT_KEY;时,javac抱怨非法演员。我尝试了很多变种,但似乎没有任何效果。必须有办法做到这一点。任何人吗?

修改

我忘了在代码中的其他地方提到我想做的事情:

void foo(Iterable<? extends Entry<K, V>> entries) {                
    Iterable<T> keys = Iterables.<Entry<K, V>, K>transform(entries,
                             MapEntries.extractKey());
    // more code follows...
}

使用(Function) EXTRACT_KEY强制转换解决了MapEntries中的编译错误。然而,javac仍抱怨foo():

  

参数化方法<Map.Entry<K,V>, T>transform(Iterable<Map.Entry<K,V>>, Function<? super Map.Entry<K,V>,? extends K>) of type Iterables is not applicable for the arguments (Iterable<capture#13-of ? extends Map.Entry<K,V>>,函数,对象&gt;)

1 个答案:

答案 0 :(得分:2)

您必须停止将EXTRACT_KEY视为单身人士 - 每次都分配一个新的Function - 或者接受对不安全演员表的需求,这可以通过return (Function) EXTRACT_KEY完成。