2017-08-17 29 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");