我遇到了关于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
也是对的。有人能帮我理解吗?
答案 0 :(得分:17)
r2
很好,其中包括:
如果满足以下两个条件,则方法引用表达式与函数类型一致:
函数类型标识与引用对应的单个编译时声明。
以下其中一项是正确的:
- 函数类型的结果为void。
- 函数类型的结果是R,并且将捕获转换(第5.1.10节)应用于所选编译时声明的调用类型(第15.12.2.6节)的返回类型的结果是R'(其中R是可用于推断R')的目标类型,R和R'都不是空的,R'在赋值上下文中与R兼容。
基本上,编写t2();
并忽略返回值是有效的,因此创建一个调用方法并忽略返回值的方法引用是有效的。
t3
不是有效,因为您必须提供参数,并且Runnable
不接受参数,所以没有什么可以“传递”给方法。