2013-05-15 8 views
5

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?

+0

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

+0

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

risposta

8

Si sta utilizzando il grezzoCallable tipo.

Cambio:

public interface CtiGwTask<T> extends Callable 

a questo:

public interface CtiGwTask<T> extends Callable<T> 
+0

Era così, molte grazie! – AndRAM

+0

Non problema :) I tipi grezzi sono malvagi e dovrebbero essere evitati a tutti i costi. – Bohemian

+0

Completamente d'accordo, ma devo dire che sto davvero lottando con la sintassi dei generics di java :-) – AndRAM

Problemi correlati