为什么java编译器报错第一条语句,是因为表达式() -> ""
没有明确的类型,我的意思是它可能是 Supplier <String>
或自定义功能接口(interface)类型等...?
Object emptyStringBuilder = () -> ""; // causes compiler error
Object emptyStringBuilder = (Supplier<String>)() -> "";
请详细说明具体原因好吗?
最佳答案
Lambda 表达式实现 @FunctionalInterface
- 只有一个公共(public)非静态和非默认方法的接口(interface)。在第一种情况下,编译器从左侧获取类型 - Object
,因为它无法推断出您的 lambda 表达式的类型。编译器不会为您选择任何接口(interface)。和Object
没有实现功能接口(interface),所以编译器会提示这种情况。
在第二种情况下,您使用功能接口(interface) Supplier<T>
并将其分配给 Object
这在编译方面是正确的 - 编译器很满意,因为您将特定类型(在这种情况下为 Supplier<T>
)转换为最通用的 Object
(每个类都继承自 Object
类)。
关于lambda - Java 8 类型推断错误,将 lambda 表达式分配给 Object 类型的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45488398/