It is generally reccommand to use interface rather than specific class. Many users use CompletionStage despite of the underlying CompletableFuture.
There are a bunch of new methods provided by CFFU, such as
- Cffu<List> thenMApplyFastFailAsync(Function<? super T, ? extends U>... fns)
- Cffu<Tuple2<U1, U2>> thenTupleMApplyFastFailAsync(Function<? super T, ? extends U1> fn1, Function<? super T, ? extends U2> fn2),
which are basicly extentions of stage operations.
Maybe it is better to use a new subinterface like MultiCompletionStage. MultiCompletionStage should contain the methods below

Possible problem: this change could make the project much more complex.
It is generally reccommand to use interface rather than specific class. Many users use CompletionStage despite of the underlying CompletableFuture.
There are a bunch of new methods provided by CFFU, such as
which are basicly extentions of stage operations.

Maybe it is better to use a new subinterface like MultiCompletionStage. MultiCompletionStage should contain the methods below
Possible problem: this change could make the project much more complex.