我正在使用ExecutorService,并希望生成可调用对象,以便可以使用invokeAll执行它们。
这些可调用对象具有不同的返回类型。这让我想到可以使用通配符来完成此操作。
Set<Callable<?>> executedCallables = new HashSet<Callable<?>>();
executedCallables.add(serviceHelper.getOwnerDetails()); --> returns Callable<OwnerDetails>
executedCallables.add(iqmServiceHelper.getUserDetails()); --> returns Callable<UserDetails>
类似的方式,我添加了一个用于调用所有任务的语句
List<Future<? extends Object>> futures = executorService.invokeAll(executedCallables);
这段代码给我编译错误:
The method invokeAll(Collection<? extends Callable<T>>) in the type ExecutorService is not applicable for the arguments (Set<Callable<?>>)
,我不知道该如何解决。请问有人能指出使用错误并提供正确用法吗?
需要注意的是,这个编译错误来自JDK 6,并且我认为在更高版本的JDK中也没有什么区别。
PS:关于这个问题,StackOverflow上也有一个类似的讨论:Collection of Callable and Generics。
List<Future<Object>>
,而不是List<Future<? extends Object>>
。 在这里无法将T
设为通配符。 - diesieben07Callable foo = () -> "";
Set> set = new HashSet<>();
set.add(foo::call);
ExecutorService service = null; // 在这里填写适当的内容
List> futures = service.invokeAll(set);
- diesieben07