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

标签 java java-8 method-reference

所以我早些时候做了一些编码,发现一个函数的签名只需要 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() );

关于java - 为什么实例方法引用适用于不匹配的签名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57404152/

相关文章:

java - 如何将 Java 8 IntStream 转换为列表?

functional-programming - Java 8 函数式 VS 命令式方法

java - Java 8 数组构造函数引用如何工作?

java - 带比较器的流排序方法

java-8 - 此表达式的目标类型必须是 MethodReferences 中的函数式接口(interface)

java - 如何解决 sun.security.provider.certpath.SunCertPathBuilderException?

java - 基于大文件中的字符串求和权重

dictionary - 如何使用Java 8中的方法引用进行Map合并?

java - 在Java中请求两个整数值并抛出错误

java - Bukkit 编码 - Config.yml 如何允许玩家在其中包含 {target} 和 {sender},并且它在游戏中显示为发送者名称和目标名称