Jak wysłać zadanie, które implementuje podinterfejs Callable<T>
do ExecutorService
?Prześlij zadanie implementujące podinterfejs programu Callable <T> do ExecutorService
mam podinterfejsu z Callable<T>
zdefiniowany jako:
public interface CtiGwTask<T>
extends Callable {
...
}
To właśnie definiuje kilka stałych statycznych ale dodaje żadnych metod.
Następnie mam następujący sposób, w którym execService
jest instancją FixedThreadPool
.
@Override
public CtiGwTaskResult<Integer> postCtiTask(CtiGwTask<CtiGwTaskResult<Integer>> task) {
Future<CtiGwTaskResult<Integer>> result =
execService.submit(task);
try {
return result.get();
} catch (InterruptedException | ExecutionException ex) {
LOGGER.log(Level.FINEST,
"Could not complete CTIGwTask", ex);
return new CtiGwTaskResult<>(
CtiGwResultConstants.CTIGW_SERVER_SHUTTINGDOWN_ERROR,
Boolean.FALSE,
"Cannot complete task: CTIGateway server is shutting down.",
ex);
}
}
Niestety daje to 2 niezaznaczone konwersje i 1 niezaznaczone ostrzeżenia o wywołaniu metody.
...\CtiGwWorkerImpl.java:151: warning: [unchecked] unchecked conversion
execService.submit(task);
required: Callable<T>
found: CtiGwTask<CtiGwTaskResult<Integer>>
where T is a type-variable:
T extends Object declared in method <T>submit(Callable<T>)
...\CtiGwWorkerImpl.java:151: warning: [unchecked] unchecked method invocation: method submit in interface ExecutorService is applied to given types
execService.submit(task);
required: Callable<T>
found: CtiGwTask<CtiGwTaskResult<Integer>>
where T is a type-variable:
T extends Object declared in method <T>submit(Callable<T>)
...\CtiGwWorkerImpl.java:151: warning: [unchecked] unchecked conversion
execService.submit(task);
required: Future<CtiGwTaskResult<Integer>>
found: Future
Jeśli zmienię submit
wezwanie do
Future<CtiGwTaskResult<Integer>> result =
execService.submit((Callable<CtiGwTaskResult<Integer>>) task);
Wtedy wszystko wydaje się działać, ale teraz pojawia się niesprawdzony ostrzeżenie plastikowymi.
...\src\com\dafquest\ctigw\cucm\CtiGwWorkerImpl.java:151: warning: [unchecked] unchecked cast
execService.submit((Callable<CtiGwTaskResult<Integer>>) task);
required: Callable<CtiGwTaskResult<Integer>>
found: CtiGwTask<CtiGwTaskResult<Integer>>
Więc czego mi brakuje? Czy nie powinno mieć zastosowania submit()
dla instancji podklasy programu Callable?
Jeśli to 'Future> result = execService.submit ((Callable >) zadania);' daje ci 'cast' warning, dlaczego nie wypróbować' Przyszłości > result = (Przyszłość >) execService.submit ((Zadanie >)); '? Możesz również pisać, jeśli próbowałeś czegoś takiego. –
DaGLiMiOuX
Próbowałem tak wielu rzeczy, których naprawdę nie pamiętam, ale właśnie testowałem i podejrzewałem, że nic się nie zmieniło. Ostrzeżenie odnosi się do zadania '(Callable>)", ale po zastosowaniu zwracanego typu i wywołania meto nie są już "odznaczone". –
AndRAM