Мне нужно запустить кучу задач в параллельных потоках и получить результаты.
Вот мой код:
List<Callable<? extends Object>> tasks = new ArrayList<>();
// Adding some tasks whith return different types of results:
// Callable<Double>, Callable<String>, Callable<SomeOtherType>, and so on...
List<Future<? extends Object>> results = executor.invokeAll( tasks );
Но IDE показывает мне следующую ошибку:
no suitable method found for invokeAll(List<Callable<? extends Object>>)
method ExecutorService.<T#1>invokeAll(Collection<? extends Callable<T#1>>)
is not applicable
(cannot infer type-variable(s) T#1
(argument mismatch; List<Callable<? extends Object>> cannot be converted
to Collection<? extends Callable<T#1>>
method ExecutorService.<T#2>invokeAll(Collection<? extends Callable<T#2>>,long,TimeUnit)
is not applicable
(cannot infer type-variable(s) T#2
(actual and formal argument lists differ in length))
where T#1,T#2 are type-variables:
T#1 extends Object declared in method
<T#1>invokeAll(Collection<? extends Callable<T#1>>)
T#2 extends Object declared in method
<T#2>invokeAll(Collection<? extends Callable<T#2>>,long,TimeUnit)
Подпись метода:
<T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks)
Очевидно, я могу заменить <? extends Object>
на <Object>
и вернуть все мои задачи Object
(например, заменить SomeTask1 implements Callable<Double>
на SomeTask1 implements Callable<Object>
).
Но мой вопрос: почему эта ошибка возникает? Я не понимаю, почему я не могу так писать. Кто-нибудь может это понять?