2016-08-01 76 views
1

在此代碼段中我的IDE (IDEA Intellij社區)建議將方法引用轉換爲函數接口。爲什麼方法引用需要對函數接口進行類型轉換?

這是爲什麼?

public class MethodReferences { 

    public static void main(String[] strings) { 
     Function<String, Integer> f = Integer::parseInt; 

     Predicate<Person> personPredicate = p->convert(p.getAge(),Integer::parseInt) >10; 

     //This is fine 
     System.out.println(convert("123", f)); 

     //This is fine 
     System.out.println(convert("123", (Function<String, Integer>) Integer::parseInt)); 

     //This is NOT 
     System.out.println(convert("123", Integer::parseInt)); //x1 
    } 

    private static <T, S> T convert(S s, Function<S, T> stFunction) { 
     return stFunction.apply(s); 
    } 
} 

錯誤信息我行x1得到的是:

Error:(20, 19) java: reference to println is ambiguous 
    both method println(char[]) in java.io.PrintStream and method println(java.lang.String) in java.io.PrintStream match 

Error:(20, 35) java: incompatible types: inferred type does not conform to upper bound(s) 
    inferred: java.lang.Integer 
    upper bound(s): char[],java.lang.Object 
+0

我認爲它與'Integer :: parseInt'有關係,它返回的是一個'int'而不是'Integer' – Aaron

+1

我無法用JDK 1.8.0_51重現這一點。我的代碼編譯並提供輸出。你使用的是什麼版本的JDK? – SMA

+0

@SMA代碼不可編譯... – Adelin

回答

1

它不接受,因爲parseInt函數方法有兩種不同的類型。

其中之一是隻接受一個String說法,另一個接受一個String和一個int類型:

static int parseInt(String s)

static int parseInt(String s, int radix)

在代碼中,你使用第二個,所以你應該投下來。在Eclipse中,據我所知,IDE自動理解它屬於什麼;但在IntelliJ中,您應該爲了安全和良好的編程而進行這種類型的轉換。

+2

這不是我所看到的。 NB我不得不添加一個'Person'類,用'getAge()'返回'String'來重現,此時javac報告'println(char [])'和'println(String)'之間的不明確性,沒有看到簡單的解釋。 OTOH,'parseInt(String,int)'不在計算中,因爲'R Function.apply(T)'的實現只能帶一個參數。 –

相關問題