如何为Runnable分配方法引用值

yi *_*ang 12 java 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;
}
Run Code Online (Sandbox Code Playgroud)

正如代码所示,我理解r1是对的,r3也是错的,但我不明白为什么r2也是对的.任何人都可以帮我理解吗?

Jon*_*eet 17

r2由于JLS第15.13.2节的规定,罚款很好,其中包括:

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

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

  • 以下之一是真的:

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

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

t3 无效的,因为你必须提供一个参数,而Runnable 不是一个参数,所以没有什么可以"传递"给该方法.