【问题标题】:Bad return type in lambda expression: Predicate<T> cannot be converted to Criteria<T>lambda 表达式中的错误返回类型:Predicate<T> 无法转换为 Criteria<T>
【发布时间】:2017-07-10 18:15:05
【问题描述】:

我有以下接口和类:

public interface Rule<T> {
   Predicate<T> evaluate();
}

public interface Criteria<T> {
   Predicate<T> evaluate();
}

public abstract class AbstractRule<T> implements Rule<T> {
   ...
   Set<Criteria<T>> criteria;
   ...

   @Override 
   @Nullable 
   public Predicate<T> evaluate() {
      return criteria.stream().reduce((c1, c2) -> c1.evaluate().and(c2.evaluvate()))
             .orElse(null);
   }
}

AbstractRule 类包含一组标准。我想通过评估每个标准来对规则进行评估。如标题所述,我在 c1.evaluate().and(c2.evaluate()) 上遇到编译错误。

我应该如何解决这个问题?

谢谢。

【问题讨论】:

  • 您的界面非常混乱。看起来他们不应该扩展 Predicate,只需在他们的方法上有一个Predicate&lt;T&gt; 返回类型。或者,您应该选择一个 - either 扩展 Predicate&lt;T&gt; 有一个方法返回 Predicate&lt;T&gt;。两者都不是。
  • @LouisWasserman 感谢您的建议。我删除了extends Predicate

标签: java java-8 java-stream


【解决方案1】:

这个怎么样?您应该首先将Criteria 转换为Predicate

abstract class AbstractRule<T> implements Rule<T> {
    Set<Criteria<T>> criteria;

    @Override
    @Nullable
    public Predicate<T> evaluate() {
        return criteria.stream().map(Criteria::evaluate)
                                .reduce(Predicate::and)
                                .orElse(null);
    }
}

【讨论】:

    猜你喜欢
    • 2012-08-04
    • 1970-01-01
    • 2019-10-11
    • 2019-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-02
    相关资源
    最近更新 更多