2013-05-15 8 views
5

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?

+0

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

+0

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

Odpowiedz

8

Używany jest typ rawCallable.

Zmiana:

public interface CtiGwTask<T> extends Callable 

do tego:

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

To wszystko, wielkie dzięki! – AndRAM

+0

Nie ma problemu :) typy surowe są złe i należy ich unikać za wszelką cenę. – Bohemian

+0

W pełni się zgadzam, ale muszę powiedzieć, że naprawdę walczę ze składnią generyczną języka Java :-) – AndRAM

Powiązane problemy