CompletableFuture currently has a method like this: public CompletableFuture<Void> acceptEither (CompletableFuture<? extends T> other, Consumer<? super T> block) { return doAcceptEither(other, block, null); }
But that signature is not quite correct (not as general as it could be). The "correct" signature is public <U super T> CompletableFuture<Void> acceptEither (CompletableFuture<? extends U> other, Consumer<U> block) { return doAcceptEither(other, block, null); } but that fails to compile, because type parameters can only be constrained by extends, not super. Is implementing this on the radar? Angelika claims "lower bounds for type parameters make no sense" http://www.angelikalanger.com/GenericsFAQ/FAQSections/TypeParameters.html#Why%20is%20there%20no%20lower%20bound%20for%20type%20parameters ? but I am finding that hard to believe. Is she right? For comparison, the equivalent static method can be made to do what we want: public static <U> CompletableFuture<Void> acceptEither (CompletableFuture<? extends U> f, CompletableFuture<? extends U> other, Consumer<U> block) { return ... }