lambda - Java 8 类型推断错误,将 lambda 表达式分配给 Object 类型的变量

标签 lambda casting java-8 type-inference

为什么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/

相关文章:

Haskell,创建一个给定特定类型的函数

lambda - 如何在 Java 功能接口(interface)中使用 andThen 或类似方法包装函数

java - 如何过滤整数并将它们从字符串复制到新数组

php - PDO::PARAM_* 与强制转换

java - 当类名称冲突时导入包而不是类?

Java 8 lambda 表达式 : Summing up method return values in a for each call for List/Set and Iterable

c++ - 修改通过std::future的lambda中的引用捕获的值

c++ - 在静态常量成员数组中将 char 类型转换为字符串

java - java8中如何使用peek()和filter()?

java - 使用 LocalDateTime 解析 DateTime 时异常无法从 TemporalAccessor 获取 LocalDateTime