Lambda casting rules

前端 未结 2 1898
迷失自我
迷失自我 2020-12-31 10:05

I was curious why a lambda with a return type can not be casted to a Runnable whereas a non void method reference can.

Runnable r1 = () -> 1;         


        
相关标签:
2条回答
  • 2020-12-31 10:16

    This is not really a “special” rule for Lambdas. It has always been acceptable to use a non-void method in a statement context (in which case, the return value is thrown away), but not so with a simple expression. For instance “String.valueOf(true);” is a valid java statement, that may occupy a line by itself, whereas “true;” is not and may not.

    0 讨论(0)
  • 2020-12-31 10:32

    The Runnable interface defines the run method with return type void. In a lambda expression that means that the part following the arrow -> must be a statement. This is explained in JLS §15.27.3:

    If the function type's result is void, the lambda body is either a statement expression (§14.8) or a void-compatible block.

    The JLS $14.5 clearly defines the syntax of a statement. As explained above it must be an "ExpressionStatement" (§ 14.8). Looking there, you can find that a simple literal is not an adequate expression, but a method invocation is (even if it returns something).

    0 讨论(0)
提交回复
热议问题