我有以下方法:
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<>());
由于擦除,它工作正常。
“ methodB”的主体正确无误。
即使您这样说,的最后一个参数methodB
本质上就是为什么您的代码无法编译的原因。由于某种原因,类型callback
为a CompletableFuture<Bar<T>>
,但是callback
传递给的参数methodA
为a CompletableFuture<InputStream>
,而an InputStream
不是a Bar<T>
。
为了进行编译,可以更改methodB
为以下内容:
private <T> CompletableFuture<Bar<T>> methodB(Foo request, Function<Foo, Bar<T>> mapper, CompletableFuture<T> callback) {
return null;
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句