我想要这样的东西(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()
使用泛型来保证类型安全。
不幸的是,javac 在我写return EXTRACT_KEY;
. 我尝试了许多变体,但似乎没有任何效果。必须有办法做到这一点。任何人?
编辑:
我忘了提到我想做的代码中的其他地方:
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>>,
Function,Object>)