问题 如何为Runnable分配方法引用值


我有一个关于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 也是对的。任何人都可以帮我理解吗?


8672
2018-06-30 09:10


起源

@YassinHajaj嗯,你是对的!对不起,我失败了:) - Hrabosch
@Hrabosch没问题:) - Yassin Hajaj
@Hrabosch,r3错了,我只是不明白为什么r2是对的 - yi jiang
@yijiang我认为因为你调用方法引用没有参数的静态方法,所以我不知道为什么会出现问题。你懂我的意思吗? - Hrabosch
@Hrabosch,众所周知,Runnable的run方法没有param和return类型,但是我的代码中的t2()有返回类型,所以我不知道为什么它可以分配给Runnable r2 - yi jiang


答案:


r2 很好,因为 JLS第15.13.2节, 包括:

如果满足以下两个条件,则方法引用表达式与函数类型一致:

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

  • 以下之一是真的:

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

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

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


16
2018-06-30 09:15