无法推断嵌套类型的类型变量T.

时间:2018-03-24 01:58:41

标签: java generics

我有以下方法:

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<>());

由于擦除,它工作正常。

1 个答案:

答案 0 :(得分:2)

  

&#34;方法B&#34;的主体是正确和有效的。

即使您这样说,methodB的最后一个参数也是您的代码无法编译的原因。出于某种原因,callback的类型为CompletableFuture<Bar<T>>,但传递给callback的{​​{1}}参数为methodACompletableFuture<InputStream>不是InputStream

要进行编译,您可以将Bar<T>更改为以下内容:

methodB