这两种创建 lambda 的方式有什么区别?为什么第一个不编译?
Predicate<Integer> predicate = Predicate.isEqual(0).or(Predicate.isEqual(1));
给出:
错误:类型不兼容: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));
这个有效。
最佳答案
添加<Integer>
在 isEqual
之前方法调用应该有所帮助:
Predicate<Integer> predicate = Predicate.<Integer>isEqual(0).or(Predicate.isEqual(1));
这种编译器行为背后的原因:
-
isEqual
是一个返回Predicate<T>
的静态泛型方法(无论其输入参数的实际类型是什么),所以它返回Predicate<Object>
在未明确指定返回类型的情况下调用方法时。 -
or
也是一个静态泛型方法,但它返回一个由相同类型参数化的谓词作为其输入参数(即Predicate<Object>
)。
关于java - Lambda 作为 Predicate 接口(interface)中方法的组合,如果它被写成一条语句则无法编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50152693/