为什么实例方法引用适用于不匹配的签名?

Why does an instance method-reference work for mismatching signatures?

所以我早些时候做了一些编码,发现一个函数的签名只接受 Function<FooClass, String>,我可以为 FooClass 的函数传递一个方法来生成一个字符串(见下面的例子)。

所以我发现 java 支持它,我的意思是..它可以编译,而且我找到了一篇文章 describing the feature here

public static class Foo {
    public String produceString() {
        return "Hello world!";
    }
}

public static String test(Function<Foo, String> produceString) {
    return produceString.apply(new Foo());
}

public static void main(String[] args) {
    // WEIRD CODE BELOW!! Here's the method reference:
    String output = test(Foo::produceString);
    System.out.println(output);
    // Outputs "Hello world!"
}

我的问题是:java 到底是怎么做到的!?

有人能解释一下为什么 这行得通吗?

您可以将方法引用作为语法糖来创建相应的 lambda 表达式:

String output = test(Foo::produceString);

鉴于produceString是一个实例方法,上面的表达式等价于

String output = test( (Foo foo) -> foo.produceString() );