Désolé pour le titre pauvre, si quelqu'un a une meilleure idée je suis ouvert à la suggestion. Je jouais avec le CompletableFuture
et je suis tombé sur quelque chose d'étrange.Java 8 CompletableFuture renvoyant un sous-type de la déclaration
Disons que vous avez 2 classes: A
et B
où B extends A
, donc B
est un sous-type de A
.
Maintenant, Déclarons un CompletableFuture
:
CompletableFuture<A> promiseofA = CompletableFuture.supplyAsync(() -> new B());
Cela fonctionne parce B
étant un sous-type de A
est conforme à la déclaration du CompletableFuture
. Maintenant, si je veux ajouter une étape exceptionally
, j'ai une compilation exception:
CompletableFuture<A> promiseOfA = CompletableFuture.supplyAsync(() -> new B())
.exceptionally(ex -> new B());
Dans ce cas, Java se plaint, déclarant que:
Compilation error[ java.util.concurrent.CompletableFuture<B> cannot be converted to java.util.concurrent.CompletableFuture<A>]
Pourquoi est-il fonctionne sans l'étape excepionally
et pas avec ça?
spécifiquement: il est l'inférence du type de fonction fournisseur, vous pouvez aussi faire '... supplyAsync ((Fournisseur )() -> new B() ... 'ou juste' ... supplyAsync (() -> (A) nouveau B() ... ' –