我讨论了
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; }
解决方法
由于
section 15.13.2 of the JLS,r2是罚款,其中包括:
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()有效;并且只是忽略返回值,因此创建一个调用该方法并忽略返回值的方法引用是有效的.
t3是无效的,因为你必须提供一个参数,而Runnable没有参数,所以没有什么可以“传递”给方法.