I hava a problem about 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;
}
As the code show, I understand r1
is right and r3
is wrong, but I don't understand why r2
is also right. Can anybody help me understand it?
r2
is fine due to section 15.13.2 of the JLS, which includes:
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.
Basically, it would be valid to write t2();
and just ignore the return value, so it's valid to create a method reference which calls the method and ignores the return value.
t3
isn't valid, because you have to provide a parameter, and Runnable
doesn't take a parameter, so there'd be nothing to "pass on" to the method.
See more on this question at Stackoverflow