java - 返回类型为 void 的 Lambda 表达式可以使用 wrapper 编译,但不能使用原始编译
问题描述
interface A {
void s();
}
public static void main(String[] args) {
A a = () -> 5; // DOES NOT compile
A b = () -> new Integer(5); // does compile
A c = () -> Stream.of(1, 2, 3); // does compile
}
第一行不编译而第二行和第三行编译的原因是什么?
解决方案
包装器与原始器不是原因。以下内容也不会编译:
Integer i = 5;
A b = () -> i;
JLS 15.27.3 对此进行了介绍:
如果函数类型的结果为 void,则 lambda 主体是语句表达式(第 14.8 节)或 void 兼容块。
5
既不是语句也不是 void 兼容块。所以A a = () -> 5;
不会编译。
这种限制的原因是返回 void 的 lambda 仅在它通过副作用操作时才有意义。简单地返回一个类似的值() -> 5
没有副作用,因此这样的 lambda 表达式绝对是一个错误。
推荐阅读
- javascript - 如何限制 ResizeObserver?
- ruby - CSV 解析器,具有非常特定数据的缓冲区溢出问题
- python - Python:测试列表理解中的字符串中的字符串(仅在 PDB 中不起作用)
- vuejs3 - vueJS 3.x:对于标签式导航,我如何引用组件但不加载它?
- python - 您如何将此循环编写为列表理解?
- python - 如何在不同的聚会上找到所有具有共同日期的行
- amazon-web-services - AWS CloudFormation + Elastic Beanstalk 错误
- stenciljs - 如何在 StencilJS 组件中测试事件
- java - Java中重写的哈希函数
- splunk - 变换中的最大匹配线。会议