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)
你能详细说明确切的原因吗?
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被定义为多表达式(它们取决于它们使用的上下文 - 如泛型、方法引用、三元运算符)
| 归档时间: |
|
| 查看次数: |
138 次 |
| 最近记录: |