2017-08-17 128 views
2

我仍然在學習功能接口。我想知道爲什麼我能夠將UnaryOperator鏈接到Function的末尾,而不是IntUnaryOperator到同一個函數的末尾。鏈接功能接口 - IntUnaryOperator vs UnaryOperator

UnaryOperator <String> twoOfMe = s -> s + s; 
Function <String, Integer> convertMe = s -> Integer.parseInt (s); 

UnaryOperator <Integer> twiceMe = n -> 2*n; 

IntUnaryOperator doubleMe = n -> 2*n; 

int a = twoOfMe.andThen(convertMe).andThen(twiceMe).apply ("2"); 

int b = twoOfMe.andThen(convertMe).andThen(doubleMe).apply ("2"); 

int a作品與twiceMeint b不與doubleMe工作。

感謝

編輯: 它說,不兼容的類型。必需的int。發現java.lang.Object

+0

你是什麼意思的「不工作」?異常?警告 ?不是預期的結果? – azro

+0

僅僅因爲andThen()接受一個Function作爲參數,而UnaryOperator擴展了Function,但IntUnaryOperator不接受。 –

回答

3

andThen(Function<? super R, ? extends V> after)預計有Function的說法。 UnaryOperator<Integer>Function<Integer,Integer>的子接口,與之匹配。 IntUnaryOperator與接口Function無關,因此doubleMe不能傳遞給andThen

+0

太簡單了。很有幫助。謝謝。 – JonJavaK

0

如果你看看IntUnaryOperator類,你會發現它沒有擴展任何接口,另一方面UnaryOperator確實擴展了Function接口。

您提供的代碼不適用於IntUnaryOperator,因爲它期望Function這不是IntUnaryOperator真正的代碼。

0

這是因爲IntUnaryOperatorint映射到int和功能<String, Integer> convertMe是返回一個Integer,不是int。你不能連鎖他們。

您可以聲明ToIntFunction<String> convertMe = s -> Integer::parseInt;,然後您可以鏈接它們。

UnaryOperator<String> twoOfMe = s -> s + s; 
ToIntFunction<String> convertMe = Integer::parseInt; 
IntUnaryOperator doubleMe = n -> 2*n; 
int b = twoOfMe.andThen(convertMe).andThen(doubleMe).apply ("2");