我想将List<Promise<Boolean>>
转换为Promise<List<Boolean>>
。我知道这可以使用sequence
方法实现,但我在使类型正确时遇到了一些问题。
这是我尝试过的:
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);
这不会编译,因为“参数类型List<Promise<Boolean>>
不符合形式参数类型Iterable<Promise<? extends A>>
”。
声明foo
的类型符合上述错误消息所建议的形式参数类型:
List<Promise<? extends Boolean>> foo = new ArrayList<Promise<Boolean>>()
根据this answer中列出的子类型规则,Promise<Boolean>
应该是Promise<? extends Boolean>
的子类型,但我在这里遇到类型不匹配:“无法转换为{{ 1}}到ArrayList<F.Promise<Boolean>>
。
从List<F.Promise<? extends Boolean>>
的实例化中删除类型信息:
ArrayList<Promise<Boolean>>
这会编译但会导致我想要删除未经检查的转换的警告:“类型List<Promise<? extends Boolean>> foo = new ArrayList();
的表达式需要取消选中转换以符合ArrayList
。”
我错过了什么?如何才能使类型正确排列?
答案 0 :(得分:2)
您可以改为使用此声明:
List<Promise<? extends Boolean>> foo = new ArrayList<Promise<? extends Boolean>>();
检查以下答案,了解其工作原理: