如何将方法引用值分配给 Runnable

Posted

技术标签:

【中文标题】如何将方法引用值分配给 Runnable【英文标题】:How assign a method reference value to Runnable 【发布时间】:2016-11-02 06:50:06 【问题描述】:

我有一个关于 Java 8 Runnable 的问题。

 public static void main(String[] args) 
    Runnable r1 = Test::t1;
    Runnable r2 = Test::t2;
    Runnable r3 = Test::t3;


public static void t1() 



public static String t2() 
    return "abc";


public static String t3(String t) 
    return t;

如代码所示,我理解r1 是对的,r3 是错的,但我不明白为什么r2 也是对的。谁能帮我理解一下?

【问题讨论】:

@YassinHajaj 嗯,你是对的!对不起,我失败了:) @Hrabosch 没问题 :) @Hrabosch,r3 错了,我就是不明白为什么 r2 是对的 @yijiang 我认为是因为您将方法引用调用为没有参数的静态方法,所以我不知道为什么会有问题。你知道我的意思吗? @Hrabosch,众所周知,Runnable的run方法是没有参数和返回类型的,但是我代码中的t2()有返回类型,所以不知道为什么可以赋值到可运行 r2 【参考方案1】:

r2 很好,因为section 15.13.2 of the JLS,其中包括:

如果以下两个都为真,则方法引用表达式与函数类型一致:

函数类型标识对应于引用的单个编译时声明。

下列情况之一为真:

函数类型的结果为void。 函数类型的结果是 R,对所选编译时声明的调用类型 (§15.12.2.6) 的返回类型应用捕获转换 (§5.1.10) 的结果是 R' (其中 R 是可用于推断 R') 的目标类型,R 和 R' 都不是 void,并且 R' 在赋值上下文中与 R 兼容。

基本上,写t2();并忽略返回值是有效的,因此创建一个调用方法并忽略返回值的方法引用是有效的。

t3 有效,因为你必须提供一个参数,而Runnable 带一个参数,所以什么都没有“传递”给方法。

【讨论】:

以上是关于如何将方法引用值分配给 Runnable的主要内容,如果未能解决你的问题,请参考以下文章

当我取消引用指针并将值分配给某个变量时,内存会发生啥?

为啥可以通过构造函数将临时值分配给引用?

如何使用 AutoMapper 将父引用分配给子属性

将从方法返回的引用分配给变量

将临时绑定到左值引用

如何将字符串列分配给变量并在 Bash 脚本的输出中引用它