Vert.x java列表<;期货>;参数化

Vert.x java列表<;期货>;参数化,java,list,future,vert.x,Java,List,Future,Vert.x,前几天我遇到了一个关于Vert.x futures的奇怪问题,它没有破坏代码,但仍然困扰着我 不带参数的Future将导致以下警告: 未来是一种原始类型。对泛型类型Future的引用应参数化 添加参数,问题已解决: Future<YourClassName> future = ... 未来=。。。 在处理期货列表时,您还可以将其参数化: List<Future<YourClassName>> future = ... 列出未来=。。。 但似乎无法处理参

前几天我遇到了一个关于Vert.x futures的奇怪问题,它没有破坏代码,但仍然困扰着我

不带参数的Future将导致以下警告:

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

添加参数,问题已解决:

Future<YourClassName> future = ...
未来=。。。
在处理期货列表时,您还可以将其参数化:

List<Future<YourClassName>> future = ...
列出未来=。。。
但似乎无法处理参数化列表并强制您删除该参数

有没有办法让参数化的未来列表与
CompositeFuture
一起工作,或者我们只需要忽略这个警告?它不会破坏任何东西,但如果能找到一个解决方案来消除该警告,那将是一件好事。

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

Future<String> fut1 = asyncOp1();
Future<Integer> fut2 = asyncOp2();
Future<CompositeFuture> all = CompositeFuture.all(fut1, fut2);
Future fut1=asyncOp1();
Future fut2=asyncOp2();
Future all=合成Future.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()]));
    }
}
接口MyCompositeFuture扩展了CompositeFuture{
//举个例子,这就是普通人所做的
/*
静态合成未来全部(列出未来){
返回CompositeFutureImpl.all(futures.toArray(newfuture[futures.size()]);
}
*/
静态合成未来全部(列出未来){
返回CompositeFutureImpl.all(futures.toArray(newfuture[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);
List listFuturesT=new ArrayList();
//这很有效
MyCompositeFuture.all(listFuturesT);
List listFutures=新建ArrayList();
//这不是,这就是最初设计决策的原因
MyCompositeFuture.all(列表期货);
[推广评论]

评论中来自@的建议确实对我的情况有所帮助

val futures:util.List[Future[List[CustomClass]]]=asyncCode()
//不起作用
val compositeFuture=compositeFuture.all(未来)
//工作
val compositeFuture=compositeFuture.all(新的util.ArrayList[Future[\u]](futures))

将列表传递给all方法时,是否可以将列表强制转换为未经参数化的列表:
CompositeFuture.all((list)future)
?这可能仍然会在强制转换时给您一个警告,但至少在方法调用之外,您的列表将包含参数化的未来。除此之外,我只能考虑与Valt.x开发人员联系,询问他们是否会考虑更改所有方法的签名。List@911DidBush您不能这样做(导致无法从
列表转换到列表
)错误,即使它确实有效,你可以把问题从一个地方转移到另一个地方,你说得对。我应该在那之前检查一下。但是,您可以使用复制构造函数将其转换为CompositeFuture.all(newarraylist(future))
,而不是强制转换。您当然是对的,这不会给您带来太多,但至少您可以在.all调用之外完全参数化列表,并保留一些类型安全性。也许其他人有另一个想法,但除非vert.x更改该方法的签名,否则您可能不得不接受代码中某个点的原始类型+警告。更新签名以接受
列表>
会很好,它在Java中可以工作,但codegen不支持通配符(CompositeFuture用@VertxGen注释,并用其他语言翻译)我看不出这对列表有什么帮助。