在Play框架中将承诺列表转换为列表承诺

时间:2014-01-10 09:33:14

标签: java generics playframework type-mismatch

我想将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。”


我错过了什么?如何才能使类型正确排列?

1 个答案:

答案 0 :(得分:2)

您可以改为使用此声明:

List<Promise<? extends Boolean>> foo = new ArrayList<Promise<? extends Boolean>>();

检查以下答案,了解其工作原理: