2017-08-17 6 views
2

私はまだ機能的インタフェースを学んでいます。なぜ私はFunctionの最後にUnaryOperatorをチェーンすることができるのか知りたいのですが、同じ機能の最後にIntUnaryOperatorはありません。機能的インタフェースの連鎖 - IntUnaryOperatorと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 atwiceMeで動作しますが、doubleMeint b動作しません。

おかげ

編集: それは互換性のない型を言います。必須のint。見つかったjava.lang.Object

+0

"doesnt work"とはどういう意味ですか?例外?警告?期待された結果ではありませんか? – azro

+0

andThen()はFunctionを引数にとり、UnaryOperatorはFunctionを拡張しますがIntUnaryOperatorはそうでないためです。 –

答えて

3

andThen(Function<? super R, ? extends V> after)は、Function引数を想定しています。 UnaryOperator<Integer>Function<Integer,Integer>のサブインターフェイスです。これは一致します。 IntUnaryOperatorFunctionインターフェイスと関係がないため、doubleMeandThenに渡すことはできません。

+0

それで簡単です。非常に役立ちます。ありがとうございました。 – JonJavaK

0

IntUnaryOperatorクラスを調べると、インターフェイスが拡張されないことがわかります。一方、UnaryOperatorは、Functionインターフェイスを拡張します。

IntUnaryOperatorと実際には一致しないFunctionがあるため、指定したコードはIntUnaryOperatorで動作しません。

0

IntUnaryOperatorintintをマップし、機能<String, Integer> convertMeInteger、ない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"); 
関連する問題