我有一个关于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 不是一个参数,所以没有什么可以"传递"给该方法.
| 归档时间: |
|
| 查看次数: |
1352 次 |
| 最近记录: |