CompletableFuture is a class that implements interface
CompletionStage. That means that anything you can do with
CompletionStage, you can also do with
CompletableFuture. However,
CompletableFuture has some methods that aren't in
CompletionStage. For instance,
join() or
getNow(T). For a complete list, check out the
non-static methods and check for those that don't include "Specified by".
I don't really see a reason for
completedStage (or
failedStage. I guess they can be useful if you don't want the object to contain any of the methods of
CompletableFuture, because the returned instance cannot be cast to it, but again - I don't see any reason for that.