如果作为一个语句编写,则作为Predicate接口的方法组合的Lambda不会编译

dan*_*iel 6 java generics lambda currying java-8

这两种lambda创造方式有什么区别?为什么不编译第一个?

Predicate<Integer> predicate = Predicate.isEqual(0).or(Predicate.isEqual(1));
Run Code Online (Sandbox Code Playgroud)

给出: 错误:不兼容的类型:Predicate<Object>无法转换为Predicate<Integer> = Predicate.isEqual(0).or(Predicate.isEqual(1));

Predicate<Integer> pred21 = Predicate.isEqual(0);
Predicate<Integer> pred22 = pred21.or(Predicate.isEqual(1));
Run Code Online (Sandbox Code Playgroud)

这个工作.

Vad*_*oha 7

<Integer>isEqual方法调用之前添加应该有帮助:

Predicate<Integer> predicate = Predicate.<Integer>isEqual(0).or(Predicate.isEqual(1));
Run Code Online (Sandbox Code Playgroud)

这种编译器行为背后的原因:

  • isEqual是一个静态泛型方法,它返回Predicate<T>(无论其输入参数的实际类型是什么),因此它Predicate<Object>在调用方法时返回,而不显式指定返回类型.
  • or也是一个静态泛型方法,但它返回一个由相同类型参数化的谓词,作为其输入参数(即Predicate<Object>).