Vert.x java 列表<Futures> 参数化

Vert.x java List<Futures> parameterization

前几天我 运行 遇到了 Vert.x 期货的一个 st运行ge 问题,它没有破坏代码,但仍然困扰着我。

没有参数的 Future 会导致以下警告:

Future is a raw type. References to generic type Future should be parameterized

添加参数,问题解决:

Future<YourClassName> future = ...

处理future列表时,也可以参数化就好了:

List<Future<YourClassName>> future = ...

但是 CompositeFuture.all() 似乎无法处理参数化列表并强制您删除参数。

有什么方法可以使参数化的期货列表与 CompositeFuture 一起使用,还是我们只需要忽略该警告?它不会破坏任何东西,但仍然很高兴找到一个解决方案来消除该警告。

CompositeFuture.all()returns一个CompositeFuture,它本身就是一个Future<CompositeFuture>。因此,您可以将结果分配给 Future<CompositeFuture> 而不是原始 Future:

Future<String> fut1 = asyncOp1();
Future<Integer> fut2 = asyncOp2();
Future<CompositeFuture> all = CompositeFuture.all(fut1, fut2);

一方面,您不能将 CompositeFuture.all() 与参数化期货列表一起使用。由于类型擦除,这是开发人员做出的设计决定。
但实际上,CompositeFuture.all() 并没有做任何特别的事情。所以你可能有自己的静态方法接口,它会做同样的事情:

interface MyCompositeFuture extends CompositeFuture {

    // This is what the regular does, just for example
    /*
    static CompositeFuture all(List<Future> futures) {
        return CompositeFutureImpl.all(futures.toArray(new Future[futures.size()]));
    }
    */

    static <T> CompositeFuture all(List<Future<T>> futures) {
        return CompositeFutureImpl.all(futures.toArray(new Future[futures.size()]));
    }
}

现在:

    List<Future<String>> listFuturesT = new ArrayList<>();
    // This works
    MyCompositeFuture.all(listFuturesT);

    List<Future> listFutures = new ArrayList<>();
    // This doesnt, and that's the reason for initial design decision
    MyCompositeFuture.all(listFutures);

[推广评论]

评论中来自@oh-god-spiders的建议对我的情况很有帮助。

val futures: util.List[Future[List[CustomClass]]] = asyncCode()
// Doesn’t work
val compositeFuture = CompositeFuture.all(futures)

// Works
val compositeFuture = CompositeFuture.all(new util.ArrayList[Future[_]](futures))