如何为Runnable分配方法引用值

时间:2016-06-30 09:10:16

标签: 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;
}

如代码所示,我了解r1是正确的,r3是错误的,但我不明白为什么r2也是对的。有人能帮我理解吗?

1 个答案:

答案 0 :(得分:17)

由于section 15.13.2 of the JLS

r2很好,其中包括:

  

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

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

  •   
  • 以下其中一项是正确的:

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

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

t3 不是有效,因为您必须提供参数,并且Runnable 接受参数,所以没有什么可以“传递”给方法。