首页 > 解决方案 > 返回类型为 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
    }

第一行不编译而第二行和第三行编译的原因是什么?

标签: javajava-8lambda

解决方案


包装器与原始器不是原因。以下内容也不会编译:

Integer i = 5;
A b = () -> i;

JLS 15.27.3 对此进行了介绍:

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

5既不是语句也不是 void 兼容块。所以A a = () -> 5;不会编译。

这种限制的原因是返回 void 的 lambda 仅在它通过副作用操作时才有意义。简单地返回一个类似的值() -> 5没有副作用,因此这样的 lambda 表达式绝对是一个错误。


推荐阅读