Come inoltrare un'attività che implementa un'interfaccia secondaria di Callable<T>
in un ExecutorService
?Invia attività che implementa una sottointerfaccia di Callable <T> in un ExecutorService
Ho un subinterface di Callable<T>
definita come:
public interface CtiGwTask<T>
extends Callable {
...
}
Definisce solo alcune costanti statiche, ma aggiunge alcun metodo.
Quindi ho il seguente metodo in cui execService
è un'istanza 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);
}
}
Sfortunatamente questo sta dando 2 conversioni non controllate e 1 avvisi di chiamata di metodo non controllati.
...\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
Se cambio la submit
chiamata a
Future<CtiGwTaskResult<Integer>> result =
execService.submit((Callable<CtiGwTaskResult<Integer>>) task);
Poi tutto sembra funzionare, ma ora ho un avvertimento getto incontrollato.
...\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>>
Quindi cosa mi manca? submit()
non dovrebbe applicarsi a un'istanza di una sottoclasse di Callable?
Se questo 'Futuro> risultato = execService.submit ((richiamabile >) compito);' ti dà una avvertimento 'cast', perché non provare' Future > result = (Futuro >) execService.submit ((Callable >) task); '? Puoi anche postare se hai provato qualcosa come questo. –
DaGLiMiOuX
Ho provato così tante cose che non ricordo davvero, ma ho appena provato e, come sospettavo, non cambia nulla. L'avviso si riferisce al cast '' Callable>) 'ma una volta applicato il tipo di ritorno e la chiamata methos non sono più "deselezionati". –
AndRAM