一尘不染

为什么带有返回类型的Java方法引用与Consumer接口匹配?

java

我对以下代码感到困惑

class LambdaTest {
    public static void main(String[] args) {
        Consumer<String>         lambda1 = s -> {};
        Function<String, String> lambda2 = s -> s;

        Consumer<String>         lambda3 = LambdaTest::consume; // but s -> s doesn't work!
        Function<String, String> lambda4 = LambdaTest::consume;
    }

    static String consume(String s) { return s;}
}

我本来希望lambda3的分配失败,因为我的消费方法与使用者接口中的accept方法不匹配-返回类型不同,字符串与无效。

此外,我一直认为Lambda表达式与方法引用之间存在一对一的关系,但是正如我的示例所示,事实显然并非如此。

有人可以向我解释这里发生了什么吗?


阅读 887

收藏
2020-03-05

共1个答案

一尘不染

consume(String)方法匹配Consumer<String>接口,因为它消耗了String-返回值的事实是不相关的,因为-在这种情况下-它被忽略了。(因为Consumer接口根本不希望有任何返回值)。

它必须是一种设计选择,并且基本上是一种实用程序:想象一下必须重构或复制多少种方法,才能满足功能接口(例如Consumer甚至是非常常见的接口)的需求Runnable。(请注意,例如,你可以将任何不占用任何参数的方法传递RunnableExecutor,)。

甚至方法都java.util.List#add(Object)返回值:boolean。仅仅因为它们返回了某些东西(在许多情况下大多数情况下是不相关的)而无法传递此类方法引用会很烦人。

2020-03-05