【问题标题】:Convert List of Promises into Promise of List in Play Framework在 Play 框架中将 Promise 列表转换为 List 的 Promise
【发布时间】: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&lt;Promise&lt;Boolean&gt;&gt; 不符合形式参数类型 Iterable&lt;Promise&lt;? extends A&gt;&gt;”。

第二种方法

声明foo的类型以符合上述错误消息所建议的形参类型:

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

根据this answer 中列出的子类型规则,Promise&lt;Boolean&gt; 应该是Promise&lt;? extends Boolean&gt; 的子类型,但我在这里遇到类型不匹配:“无法从ArrayList&lt;F.Promise&lt;Boolean&gt;&gt; 转换为List&lt;F.Promise&lt;? extends Boolean&gt;&gt;

第三种方法

ArrayList&lt;Promise&lt;Boolean&gt;&gt;的实例化中移除类型信息:

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

这会编译但会导致关于未经检查的转换的警告,我想摆脱它:“ArrayList 类型的表达式需要未经检查的转换才能符合 List&lt;F.Promise&lt;? extends Boolean&gt;&gt;。”


我错过了什么?如何让类型正确排列?

【问题讨论】:

    标签: java generics playframework type-mismatch


    【解决方案1】:

    您可以改用此声明:

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

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

    【讨论】:

    • 感谢您的回答!这有效,但只是因为它消除了我声明foo 的行的任何警告/编译问题。不幸的是,它阻止我在调用sequence 之前将任何Promise&lt;Boolean&gt;s 添加到foo:“List 类型中的方法add 不适用于参数F.Promise&lt;Boolean&gt;
    • 好吧,那你可以做的是,先填满你的列表,然后用上面的类型将它分配给foo引用,然后将它传递给sequence()方法。那是因为您不能向 List&lt;? extends SomeType&gt; 类型的列表添加任何内容。
    • 该临时列表应该声明为什么?因为当我执行List&lt;Promise&lt;Boolean&gt;&gt; temp = new ArrayList&lt;Promise&lt;Boolean&gt;&gt;(); 时,我可以将addtemp 就好了,但是在通过foo = temp;temp 分配给foo 之后,将foo 传递给sequence() 将不起作用。错误消息与我第一种方法得到的错误消息基本相同。
    • @itsjeyd 你的foo类型是List&lt;? extends Promise&lt;? extends Boolean&gt;&gt; foo吗?
    • @itsjeyd 啊!一个小错误。我已经更新了答案。实际上,您不需要创建temp 列表。上面的那个就行了。
    猜你喜欢
    • 2014-12-26
    • 1970-01-01
    • 2022-10-13
    • 2022-01-07
    • 1970-01-01
    • 1970-01-01
    • 2017-01-12
    • 2016-07-05
    相关资源
    最近更新 更多