Java 8 CompletableFuture从声明中返回一个子类型

Mar*_*YOT 2 java completable-future

抱歉这个糟糕的头衔,如果有人有更好的主意,我愿意接受建议.

我正在玩这个CompletableFuture,我偶然发现了一些奇怪的东西.

假设你有两个类:AB哪里B extends A,B也是一个子类型A.

现在,让我们宣布一个CompletableFuture:

CompletableFuture<A> promiseofA = CompletableFuture.supplyAsync(() -> new B());
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为B它的子类型A符合声明CompletableFuture.现在,如果我想添加一个exceptionally步骤,那么我有一个编译异常:

CompletableFuture<A> promiseOfA = CompletableFuture.supplyAsync(() -> new B())
                                                   .exceptionally(ex -> new B());
Run Code Online (Sandbox Code Playgroud)

在这种情况下,Java正在抱怨,说:

Compilation error[ java.util.concurrent.CompletableFuture<B> cannot be converted to java.util.concurrent.CompletableFuture<A>]
Run Code Online (Sandbox Code Playgroud)

为什么没有这个excepionally步骤而没有它呢?

Kis*_*kae 6

添加时它不起作用,exceptionally因为它完全依赖于其输入的源未来.

这意味着,特别是它看到了源的未来CompletableFuture<B>,那么它返回的类型必须是CompletableFuture<B>.

如果指定源实际上是CompletableFuture<A>(CompletableFuture.<A>supplyAsync(...))那么它将再次正确编译.这是Java中泛型类型推导的问题.

  • 具体来说:它是供应商功能类型的推论,你也可以做`... supplyAsync((Supplier <A>)() - > new B()...`或者只是`... supplyAsync(() - >(A)新B()......` (2认同)