私はこのようなものを持ちたいです(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>)