How assign a method reference value to Runnable
Asked Answered
S

1

13

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?

Saharanpur answered 30/6, 2016 at 9:10 Comment(6)
@YassinHajaj Huh, you are right! Sorry, my fail :)Downturn
@Downturn No problem :)Mantellone
@Hrabosch,r3 is wrong , i just don't understand why r2 is rightSaharanpur
@yijiang I think because that you call method reference to static method without parameter, so i dont know why there should be a problem. Do you know what i mean?Downturn
@Hrabosch, as we all know, the Runnable's run method is without param and return type, but t2() in my code has the return type, so i don't know why it can be assigned to Runnable r2Saharanpur
@yijiang Yes, but in think, in this case you are calling second method without parameter (what is correct) and about returning value there is rule which is described in answer, in this case is ignored return valueDownturn
C
19

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.

Contradance answered 30/6, 2016 at 9:15 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.