How assign a method reference value to Runnable

泪湿孤枕 提交于 2020-04-12 09:31:30

问题


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?


回答1:


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.



来源:https://stackoverflow.com/questions/38118627/how-assign-a-method-reference-value-to-runnable

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!