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

mar*_*ouf 7 lambda casting type-inference java-8

为什么java编译器抱怨第一个语句,这是因为表达式() -> ""没有明确的类型,我的意思是它可能是一个Supplier <String>或自定义的功能接口类型等等?

Object emptyStringBuilder = () -> ""; // causes compiler error

Object emptyStringBuilder = (Supplier<String>)() -> "";
Run Code Online (Sandbox Code Playgroud)

你能详细说明确切的原因吗​​?

Eug*_*ene 2

lambda 表达式的类型推断是从目标类型发生的,这意味着当您编写如下内容时:

 () -> "";
Run Code Online (Sandbox Code Playgroud)

这确实是一个Supplier(对你来说,而不是编译器),但是如果我有一个这样声明的类型怎么办:

static interface Producer<T> {
    T produce();
}
Run Code Online (Sandbox Code Playgroud)

这意味着您的 lambda 可以是 aProducer或 a Supplier。因此,必须分配给 a @FunctionalInterface(或转换),以便可以进行类型推断。

这些JLS被定义为多表达式(它们取决于它们使用的上下文 - 如泛型、方法引用、三元运算符)