Java 无法推断嵌套类型的类型变量T
我有以下方法:Java 无法推断嵌套类型的类型变量T,java,generics,Java,Generics,我有以下方法: public class Example { public CompletableFuture<Bar<InputStream>> methodA(CompletableFuture<InputStream> callback) { return methodB(new Foo(), this::mapper, callback); } private <T> CompletableFutu
public class Example {
public CompletableFuture<Bar<InputStream>> methodA(CompletableFuture<InputStream> callback) {
return methodB(new Foo(), this::mapper, callback);
}
private <T> CompletableFuture<Bar<T>> methodB(Foo request, Function<Foo, Bar<T>> mapper, CompletableFuture<Bar<T>> callback) {
return null;
}
private Bar<InputStream> mapper(Foo foo) {
return new Bar<>();
}
}
公共类示例{
公共CompletableFuture方法A(CompletableFuture回调){
返回methodB(newfoo(),this::mapper,回调);
}
私有CompletableFuture方法B(Foo请求、函数映射器、CompletableFuture回调){
返回null;
}
私人酒吧映射器(Foo-Foo){
返回新条();
}
}
无法编译从“methodA”到“methodB”的调用,因为:
Error:(9, 16) java: method methodB in class example.Example cannot be applied to given types;
required: example.Foo,java.util.function.Function<example.Foo,example.Bar<T>>,java.util.concurrent.CompletableFuture<example.Bar<T>>
found: example.Foo,this::mapper,java.util.concurrent.CompletableFuture<java.io.InputStream>
reason: cannot infer type-variable(s) T
(argument mismatch; java.util.concurrent.CompletableFuture<java.io.InputStream> cannot be converted to java.util.concurrent.CompletableFuture<example.Bar<T>>)
错误:(9,16)java:类示例中的方法methodB。示例无法应用于给定类型;
必需:example.Foo、java.util.function.function、java.util.concurrent.CompletableFuture
找到:example.Foo,this::mapper,java.util.concurrent.CompletableFuture
原因:无法推断类型变量T
(参数不匹配;java.util.concurrent.CompletableFuture无法转换为java.util.concurrent.CompletableFuture)
我理解(某种程度上)为什么会发生错误。编译器似乎混淆了未来的类型参数和函数的类型参数。我不确定的是如何解决这个问题?“方法B”的主体是正确的,并且有效
有趣的是如果你打电话
methodB(new Foo(), this::mapper, new CompletableFuture<>());
methodB(newfoo(),this::mapper,newcompletablefuture());
由于擦除,它工作得很好
“方法B”的主体是正确的,并且有效
即使您这样说,methodB
的最后一个参数本质上就是代码无法编译的原因。出于某种原因,回调
的类型是一个CompletableFuture
,但是传递给methodA
的回调
参数是一个CompletableFuture
,而输入流
不是一个条
要编译此文件,可以将methodB
更改为以下内容:
private <T> CompletableFuture<Bar<T>> methodB(Foo request, Function<Foo, Bar<T>> mapper, CompletableFuture<T> callback) {
return null;
}
private CompletableFuture方法b(Foo请求、函数映射器、CompletableFuture回调){
返回null;
}
InputStream
不是Bar
Ug,此代码中有太多回调。我正被调头。谢谢