【发布时间】:2014-01-10 09:33:13
【问题描述】:
我想将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> 的子类型,但我在这里遇到类型不匹配:“无法从ArrayList<F.Promise<Boolean>> 转换为List<F.Promise<? extends Boolean>>。
第三种方法
从ArrayList<Promise<Boolean>>的实例化中移除类型信息:
List<Promise<? extends Boolean>> foo = new ArrayList();
这会编译但会导致关于未经检查的转换的警告,我想摆脱它:“ArrayList 类型的表达式需要未经检查的转换才能符合 List<F.Promise<? extends Boolean>>。”
我错过了什么?如何让类型正确排列?
【问题讨论】:
标签: java generics playframework type-mismatch