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,此代码中有太多回调。我正被调头。谢谢