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



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

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

未来是一种原始类型。对泛型类型 Future 的引用应参数化

添加参数,问题解决:

Future<YourClassName> future = ...

在处理期货列表时,您还可以将其参数化:

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

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

有没有办法使参数化的未来列表与CompositeFuture一起工作,或者我们只需要忽略这个警告?它不会破坏任何东西,但找到一个解决方案来摆脱该警告仍然很好。

一方面,您不能将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);

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

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

[推广评论]

评论中@oh神蜘蛛的建议对我的情况确实有所帮助。

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))

最新更新