我有以下方法:
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<>();
}
}
从“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>>)
我理解(有点)错误发生的原因。编译器似乎将未来的类型参数与函数的类型混淆。我不确定的是如何解决这个问题? “methodB”的正文是正确无误的。
有趣的是,如果你打电话
methodB(new Foo(), this::mapper, new CompletableFuture<>());
由于擦除,它工作正常。
答案 0 :(得分:2)
&#34;方法B&#34;的主体是正确和有效的。
即使您这样说,methodB
的最后一个参数也是您的代码无法编译的原因。出于某种原因,callback
的类型为CompletableFuture<Bar<T>>
,但传递给callback
的{{1}}参数为methodA
,CompletableFuture<InputStream>
不是InputStream
。
要进行编译,您可以将Bar<T>
更改为以下内容:
methodB