2013-02-09 42 views
0

我想有這樣的事情(JAVA)的關鍵:谷歌番石榴函數提取了Map.Entry

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的仍抱怨富():

參數化方法<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>>,功能,對象>)

+0

對於第二種情況,您必須使用MapEntries。 extractKey()'。 – 2013-02-09 07:42:33

回答

2

,必須停止治療EXTRACT_KEY爲單 - 每次分配一個新的Function - 或接受需要不安全的演員陣容,可以通過return (Function) EXTRACT_KEY完成。

+0

不安全的強制轉換http://www.docjar.com/html/api/java/util/Collections.java.html#3151 – 2013-02-09 04:57:48