前几天,我在Vert.x期货上遇到了一个奇怪的问题,它并没有破坏代码,但仍然困扰着我。
在没有参数的情况下,未来将产生以下警告:
未来是一种原始类型。对泛型类型未来的引用应该参数化
添加参数,解决问题:
Future<YourClassName> future = ...在处理期货列表时,您还可以很好地参数化它:
List<Future<YourClassName>> future = ...但是CompositeFuture.all()似乎不能处理参数化的列表,并强迫您删除参数。
是否有任何方法可以使参数化的期货列表与CompositeFuture一起工作,还是我们只需忽略这一警告?它不会破坏任何东西,但仍然是很好的解决办法,以消除这一警告。
发布于 2017-01-05 17:03:30
一方面,你不能在参数化期货列表中使用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);发布于 2017-01-04 16:31:52
CompositeFuture.all()返回一个CompositeFuture,它本身就是一个Future<CompositeFuture>。因此,您可以将结果分配给Future<CompositeFuture>而不是原始的Future。
Future<String> fut1 = asyncOp1();
Future<Integer> fut2 = asyncOp2();
Future<CompositeFuture> all = CompositeFuture.all(fut1, fut2);发布于 2020-08-27 16:52:51
促进评论
评论中的@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))https://stackoverflow.com/questions/41467014
复制相似问题