允许var在Java 10中使用类似以下的字符串进行分配:
var
var foo = "boo";
虽然不允许为其分配lambda表达式,例如:
var predicateVar = apple -> apple.getColor().equals("red");
为什么不能推断的λ或方法引用类型时,它可以推断出休息等String,ArrayList,用户类等?
String
ArrayList
从局部变量类型推断JEP:
实质上,推断过程只是将变量赋予其初始化程序表达式的类型。一些细微之处: 初始化程序没有目标类型(因为我们尚未推断出它)。需要这种类型的多边形表达式(例如 lambdas ,方法引用和数组初始化器)将触发错误。
实质上,推断过程只是将变量赋予其初始化程序表达式的类型。一些细微之处:
由于Lambda表达式本身没有类型,因此无法针对进行推断var。
…同样,可以设置默认规则。
当然,您可以想出一种方法来解决此限制。为何开发人员决定不这样做,实际上取决于猜测,除非参与决策的人可以在这里回答。无论如何,如果您有兴趣,可以在以下openjdk邮件列表中查询:http : //mail.openjdk.java.net/mailman/listinfo
如果我猜到了,他们可能不想将lambda推断var与一组特定的功能接口类型相关联,这将排除任何第三方功能接口类型。更好的解决方案是推断一个通用函数类型(即(Apple) -> boolean),然后将其转换为兼容的功能接口类型。但是JVM没有这种函数类型,并且在创建lambda表达式的项目期间已经做出了不实现它们的决定。同样,如果您对具体原因感兴趣,请询问开发人员。
(Apple) -> boolean