链接功能接口 - IntUnaryOperator 与 UnaryOperator

Chaining Functional Interfaces - IntUnaryOperator vs UnaryOperator

我还在学习函数式接口。我想知道为什么我能够将 UnaryOperator 链接到 Function 的末尾,但不能将 IntUnaryOperator 链接到同一函数的末尾。

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.

谢谢

编辑: 它说不兼容的类型。必需的整数。找到 java.lang.Object

andThen(Function<? super R, ? extends V> after) 需要一个 Function 参数。 UnaryOperator<Integer>Function<Integer,Integer>的子接口,匹配。 IntUnaryOperatorFunction 接口无关,因此 doubleMe 无法传递给 andThen

如果你看一下 IntUnaryOperator class 你会发现它没有扩展任何接口,另一方面 UnaryOperator 确实扩展了 Function 接口.

您提供的代码不适用于 IntUnaryOperator,因为它期望 Function 而不是 IntUnaryOperator 的真正含义。

这是因为 IntUnaryOperatorint 映射到 int,而函数 <String, Integer> convertMe 返回的是 Integer,而不是 int.你不能链接它们。

您可以声明 ToIntFunction<String> convertMe = 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");