java - Lambda 作为 Predicate 接口(interface)中方法的组合,如果它被写成一条语句则无法编译

标签 java generics lambda java-8 currying

这两种创建 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/

相关文章:

c# - 我怎样才能使这个简单的 C# 泛型工厂工作?

java - 如何将对象转换为给定的泛型类型,以便我可以将此对象传递给方法

java - 如何为 stanford corenlp 获取文本的 xml 输出

java - 通用边界 "Enum<T> & Foo"和 "Enum<? extends Foo>"之间有区别吗

java - Observable 不是异步的

C# - 带有 linq 参数的泛型方法

c++ - 语法繁重的多个 lambda 包装器的替代方案——如何避免样板代码?

c# - 将 C++ 特定功能映射到 C++/CLI

Java:如何将 Apache Shiro 与 Couchbase 一起使用

java - Java 8 中的顺序流在调用 collect 时是否使用组合器参数?