一尘不染

为什么不能为Java中的var关键字分配一个lambda表达式?

java

允许var在Java 10中使用类似以下的字符串进行分配:

var foo = "boo";

虽然不允许为其分配lambda表达式,例如:

var predicateVar = apple -> apple.getColor().equals("red");

为什么不能推断的λ或方法引用类型时,它可以推断出休息等StringArrayList,用户类等?


阅读 301

收藏
2020-12-03

共1个答案

一尘不染

局部变量类型推断JEP

实质上,推断过程只是将变量赋予其初始化程序表达式的类型。一些细微之处:

  • 初始化程序没有目标类型(因为我们尚未推断出它)。需要这种类型的多边形表达式(例如 lambdas ,方法引用和数组初始化器)将触发错误。

由于Lambda表达式本身没有类型,因此无法针对进行推断var


…同样,可以设置默认规则。

当然,您可以想出一种方法来解决此限制。为何开发人员决定不这样做,实际上取决于猜测,除非参与决策的人可以在这里回答。无论如何,如果您有兴趣,可以在以下openjdk邮件列表中查询:http
:
//mail.openjdk.java.net/mailman/listinfo

如果我猜到了,他们可能不想将lambda推断var与一组特定的功能接口类型相关联,这将排除任何第三方功能接口类型。更好的解决方案是推断一个通用函数类型(即(Apple) -> boolean),然后将其转换为兼容的功能接口类型。但是JVM没有这种函数类型,并且在创建lambda表达式的项目期间已经做出了不实现它们的决定。同样,如果您对具体原因感兴趣,请询问开发人员。

2020-12-03