0

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

4

1 に答える 1

2

EXTRACT_KEYシングルトンとして扱うのをやめるFunction(毎回新しいものを割り当てる) か、安全でないキャストの必要性を受け入れる必要がありreturn (Function) EXTRACT_KEYます。

于 2013-02-09T04:53:01.103 に答える