前几天我在 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))