我想要这样的东西(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;)
答案 0 :(得分:2)
您必须停止将EXTRACT_KEY
视为单身人士 - 每次都分配一个新的Function
- 或者接受对不安全演员表的需求,这可以通过return (Function) EXTRACT_KEY
完成。