Lambda投射规则

fla*_*kes 12 java lambda runnable

我很好奇为什么带有返回类型的lambda不能被转换为a Runnable而非void方法引用可以.

Runnable r1 = () -> 1; // not allowed
// error: incompatible types: bad return type in lambda expression
// int cannot be converted to void

Runnable r2 = ((Supplier)() -> 1)::get; // allowed
Run Code Online (Sandbox Code Playgroud)

See*_*ose 14

该Runnable接口定义了run与返回类型void方法.在lambda表达式中,这意味着箭头后面的部分->必须是一个语句.这在JLS§15.27.3中进行了解释:

如果函数类型的结果为void,则lambda主体是语句表达式(第14.8节)或与void兼容的块.

该JLS $ 14.5明确规定了一个语句的语法.如上所述,它必须是"ExpressionStatement"(第14.8节).在那里,您可以发现一个简单的文字不是一个适当的表达式,而是一个方法调用(即使它返回一些东西).

  • @Tunaki找到它,它是[§15.27.3](https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.27.3). (2认同)