I want to convert a List<Promise<Boolean>> into a Promise<List<Boolean>>. I know that this can be achieved using the sequence method, but I'm having some problems getting the types right.
Here is what I've tried:
First (naive) approach
List<Promise<Boolean>> foo = new ArrayList<Promise<Boolean>>;
// ... Code that loops over some other collection
// and adds multiple Promise<Boolean>s to foo
Promise<List<Boolean>> bar = Promise.sequence(foo);
This does not compile because "the argument type List<Promise<Boolean>> does not conform to formal parameter type Iterable<Promise<? extends A>>".
Second approach
Declaring the type of foo to conform to the formal parameter type as suggested by the error message above:
List<Promise<? extends Boolean>> foo = new ArrayList<Promise<Boolean>>()
As per the sub-typing rules laid out in this answer, Promise<Boolean> should be a subtype of Promise<? extends Boolean>, but I am getting a type mismatch here: "cannot convert from ArrayList<F.Promise<Boolean>> to List<F.Promise<? extends Boolean>>.
Third approach
Removing type information from instantiation of ArrayList<Promise<Boolean>>:
List<Promise<? extends Boolean>> foo = new ArrayList();
This compiles but results in a warning about unchecked conversion that I would like to get rid of: "The expression of type ArrayList needs unchecked conversion to conform to List<F.Promise<? extends Boolean>>."
What am I missing? How can I get the types to line up correctly?
 
     
    