如何将方法引用值分配给 Runnable
How assign a method reference value to 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
也是对的。谁能帮我理解一下?
r2
可以,因为 section 15.13.2 of the JLS,其中包括:
A method reference expression is congruent with a function type if both of the following are true:
The function type identifies a single compile-time declaration corresponding to the reference.
One of the following is true:
- The result of the function type is void.
- The result of the function type is R, and the result of applying capture conversion (§5.1.10) to the return type of the invocation type (§15.12.2.6) of the chosen compile-time declaration is R' (where R is the target type that may be used to infer R'), and neither R nor R' is void, and R' is compatible with R in an assignment context.
基本上,编写 t2();
并忽略 return 值是有效的,因此创建调用该方法并忽略 return 值的方法引用是有效的.
t3
不有效,因为你必须提供一个参数,而Runnable
不[=24] =] 接受一个参数,所以没有什么可以“传递”给方法。
我有一个关于 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
也是对的。谁能帮我理解一下?
r2
可以,因为 section 15.13.2 of the JLS,其中包括:
A method reference expression is congruent with a function type if both of the following are true:
The function type identifies a single compile-time declaration corresponding to the reference.
One of the following is true:
- The result of the function type is void.
- The result of the function type is R, and the result of applying capture conversion (§5.1.10) to the return type of the invocation type (§15.12.2.6) of the chosen compile-time declaration is R' (where R is the target type that may be used to infer R'), and neither R nor R' is void, and R' is compatible with R in an assignment context.
基本上,编写 t2();
并忽略 return 值是有效的,因此创建调用该方法并忽略 return 值的方法引用是有效的.
t3
不有效,因为你必须提供一个参数,而Runnable
不[=24] =] 接受一个参数,所以没有什么可以“传递”给方法。