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))
前几天我 运行 遇到了 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))