如何将方法引用值分配给 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的主要内容,如果未能解决你的问题,请参考以下文章