bur*_*mre 3 java generics lambda java-8
假设我有一个接受 java.util.function.Predicate 并返回 CompletableFuture 的方法:
public <R> CompletableFuture<R> call(Predicate<R> request) {
return new CompletableFuture<>();
}
Run Code Online (Sandbox Code Playgroud)
如果我使用这样的匿名类调用此方法:
Integer a = call(new Predicate<Integer>() {
@Override
public boolean test(Integer o) {
return false;
}
}).join();
Run Code Online (Sandbox Code Playgroud)
它之所以有效,是因为我必须显式声明谓词的类型。但是,如果我使用 lambda 表达式而不是像这样的匿名类:
Integer a = call(o -> false).join();
Run Code Online (Sandbox Code Playgroud)
它无法编译,因为 Java 认为它是 aPredicate<Object>
并返回如下消息:
Error:(126, 42) java: incompatible types: java.lang.Object cannot be converted to java.lang.Integer
Run Code Online (Sandbox Code Playgroud)
我发现了一些解决方法。我可以CompletableFuture
显式创建变量而不是链接,或者添加一个不必要的额外参数Class<R>
来告诉 Java 我们想要获取哪种类型或强制 lambda 表达式中的类型。
然而我想知道为什么 Java 选择Object
而不是Integer
在第一个 lambda 示例中,它已经知道我想要获得哪种类型,因此编译器可能会使用最具体的类型,而不是Object
因为所有三种解决方法对我来说似乎都很丑陋。
Java 8 的类型推断存在限制,它不会查看将结果分配给的变量的类型。Object
相反,它推断类型参数的类型。
o
您可以通过在 lambda 中显式指定参数类型来修复此问题:
Integer a = call((Integer o) -> false).join();
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2281 次 |
最近记录: |