为什么
java编译器抱怨第一个语句,这是因为表达式() – > “”没有明确的类型,我的意思是它可能是供应商< String>或
自定义功能接口类型等…?
Object emptyStringBuilder = () -> ""; // causes compiler error
Object emptyStringBuilder = (Supplier<String>)() -> "";
你能详细说明确切的原因吗?
lambda表达式的类型推断来自目标类型,这意味着当您编写类似这样的
内容时:
() -> "";
这确实是一个供应商(对你而不是编译器),但如果我有一个类型声明如下:
static interface Producer<T> {
T produce();
}
这意味着您的lambda可以是制作人或供应商.因此,分配必须是@FunctionalInterface(或强制转换),以便可以进行类型推断.
在JLS中,这些被定义为多重表达式(它们取决于它们的使用环境 – 如泛型,方法引用,三元运算符)