【问题标题】:Why does this method returning a lambda depend on the return type of the interface method?为什么这个方法返回一个 lambda 取决于接口方法的返回类型?
【发布时间】:2019-12-15 08:22:21
【问题描述】:

我正在查看现有代码并试图了解 lambda 表达式和函数式接口的工作原理。

代码如下:

public interface MyComparator<T> {
    public int compare(T t1, T t2);

    public static MyComparator<Person> comparing(Function<Person, Comparable> fun) {
        return (p1, p2) -> fun.apply(p1).compareTo(fun.apply(p2));
    }
}

上面这段代码编译正确,没有任何问题,但是如果我将compare方法的返回类型从int更改为String,我会得到一个错误:

Type mismatch: cannot convert from int to String

    public int compare(T t1, T t2);

为什么comparing 方法依赖于compare 方法?

【问题讨论】:

  • 重写你的标题以总结你的具体技术问题。您的问题与其他关于 lambda 和函数式接口的问题有何不同?
  • 我对您的代码示例感到困惑。您是否真的在尝试重新定义内置类型Comparator?为什么?
  • 如果这就是 OP 的意图,是的,它会更清楚。
  • 我在看 lambda 的在线课程,导师使用 Comparator 作为接口名称,所以我复制了代码的 sn-p,抱歉造成混淆

标签: java lambda java-8


【解决方案1】:

你的函数类型是Function&lt;Person, Comparable&gt;,这意味着fun.apply(p1)返回一个Comparable。这是在 Java 标准库中定义的接口,它声明了一个名为 compareTo 的方法,该方法返回一个 int,因此您的 lambda 将返回一个 int

这意味着,如果您将函数式接口定义为具有返回 int 的单个抽象方法,那么您的 lambda 符合函数式接口,因为它确实返回 int。但是如果你定义那个抽象方法返回一个String,那么这个lambda就不符合函数式接口,因为它没有返回一个String

在后一种情况下,您的 comparing 方法返回该 lambda 是一个类型错误,因为 comparing 的签名说它应该返回一个实现您的功能接口的实例,但 lambda 不符合由于 lambda 具有错误的返回类型而导致的功能接口。

【讨论】:

  • 感谢您的解释,现在很清楚,Lambda 和 Java 8 的新手,所以很难理解代码发生了什么
猜你喜欢
  • 2013-10-14
  • 1970-01-01
  • 2010-10-05
  • 2019-10-13
  • 2015-09-04
  • 2014-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多