2017-08-25 67 views
2

我正在嘗試處理Java8方法引用,並遇到非常奇怪的編譯錯誤。Java8方法引用和泛型,在某些情況下需要類型轉換

我有一個對象值的地圖,我想提供給用戶在值上應用一些函數。

所以我用這需要地圖鍵和功能接口作爲參數

我很奇怪,爲什麼我不需要投方法參照精確的實型(在微調的情況下)

泛型方法
import java.util.HashMap; 
import java.util.Map; 
import java.util.function.UnaryOperator; 

public class ReferenceDiscovering { 

    Map<String, Object> values = new HashMap<>(); 

    public static void main(String[] args) { 
     ReferenceDiscovering main = new ReferenceDiscovering(); 
     main.values.put("key1", " some text with space in start"); 
     main.values.put("key2", "AAAAAAAAAAAAAA"); 

     System.out.println(main.values); 

     main.applyFunctionByKey("key1", String::trim); 
     //  cannot resolve method toLowerCase 
     //  COMPILE ERROR HERE. WHY???? WHY NOT FOR trim? 
     //  main.applyFunctionByKey("key2", String::toLowerCase); 
     main.applyFunctionByKey("key2", (UnaryOperator<String>)String::toLowerCase); 


     System.out.println(main.values); 
    } 

    private <T> void applyFunctionByKey(String key, UnaryOperator<T> binaryOperator) { 
     if (values.containsKey(key)) { 
      values.put(key, binaryOperator.apply((T)values.get(key))); 
     } 
    } 
} 

結果:

{鍵1 =一些文本,在開始空間,鍵2 = AAAAAAAAAAAAAA} {鍵1 =一些 文本無線個空的開始,鍵2 = aaaaaaaaaaaaaa}

+5

你忘了提及你有哪些編譯錯誤完全吻合。這可能與'toLowerCase'有兩個重載的事實有關,但是我們不能沒有錯誤就知道。請[編輯]你的問題,幷包括這一點。 – RealSkeptic

+0

將其添加到代碼中。似乎奇怪爲什麼它可以解決鑄造後的方法,如果有2個 – Limmy

+1

這個編譯錯誤聽起來像@RealSkeptic有關重載的理論可能是正確的:https://ideone.com/I1Y7Am – Radiodef

回答

1

答案在評論這個問題已經給出 - 是的,問題是Java無法決定類應使用的方法從字符串(有兩個 - 一個沒有參數,另一個與區域設置)。

這也與推斷方法類型參數有關。在提供的代碼JRE的上下文中不能這樣做。

參見:

相關問題