【问题标题】:Java 8: Is it possible to assign a method reference to a variable?Java 8:是否可以将方法引用分配给变量?
【发布时间】:2014-09-10 23:17:18
【问题描述】:

我用谷歌搜索了这个问题的答案,但找不到。

在 Java 8 中,我知道这是可能的:

// someMethod is defined as: someMethod(AFunctionalInterface i)
someMethod(someObject::someOtherMethod);

问题是:是否可以做到以下几点

AFunctionalInterface i = anObject::SomeMethod;

另外,是否可以像这样将 lambda 分配给变量并传递它?

Printer f = () -> System.out.println(..); methodThatTakesPrinter(f);

【问题讨论】:

    标签: java


    【解决方案1】:

    是的,根据JLS 中引用的示例:

    Task t = () -> System.out.println("hi");
    Runnable r = t::invoke;
    

    另外声明如下:

    如果 T 是函数式接口类型(第 9.8 节)并且表达式与T派生的地面目标类型的函数类型一致。

    【讨论】:

    • 所以我应该能够做到这一点? Interface f = () -> System.out.println("hi"); anObject.doStuff(1, f);
    • @Prog 这不合逻辑。 someone 在哪里声明?它的类型是什么? Interface 是如何声明的?您可以清楚地将() -> void 分配给声明为使用单一方法void thisCanBeAnyName(); 声明的接口的变量。我对此提出了一个后续问题,即here
    • 一个更清楚的例子:Printer f = () -> System.out.println(..); methodThatTakesPrinter(f); 这可能吗?
    • @Prog 是,如果 Printer 被声明为 interface Printer{ public void someNameThatDoesntNeedToMatchInOrderToWork();}。接口必须与 lambda 或方法引用签名一致(请参阅我链接的 JLS 以获得关于此的正式声明)。
    • 但是 lambda 没有签名,除了参数。所以在上面的例子中,lambda 根本就不能有任何参数,比如 Printer 接口中定义的方法?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-22
    相关资源
    最近更新 更多