2013-05-15 19 views
5

Làm thế nào để gửi tác vụ thực hiện một giao diện con của Callable<T> đến một ExecutorService?Gửi tác vụ thực hiện một giao diện con của Gọi là <T> đến một ExecutorService

Tôi có một subinterface của Callable<T> định nghĩa là:

public interface CtiGwTask<T> 
    extends Callable { 

    ... 
} 

Nó chỉ định nghĩa một số hằng số tĩnh nhưng không có thêm phương pháp.

Sau đó, tôi có phương pháp sau đây trong đó execService là phiên bản 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); 
    } 
} 

Thật không may điều này là đưa ra 2 chuyển đổi không được kiểm soát và 1 cảnh báo gọi phương thức không được kiểm tra.

...\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 

Nếu tôi thay đổi cuộc gọi submit để

Future<CtiGwTaskResult<Integer>> result = 
    execService.submit((Callable<CtiGwTaskResult<Integer>>) task); 

Sau đó, tất cả mọi thứ dường như làm việc nhưng bây giờ tôi nhận được một cảnh báo dàn diễn viên không được kiểm soát.

...\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>> 

Vậy tôi đang thiếu gì? Không nên submit() áp dụng cho một phiên bản của một lớp con của Có thể gọi?

+0

Nếu đây 'Future > result = execService.submit ((Callable >) nhiệm vụ); 'mang đến cho bạn một 'cast' cảnh báo, tại sao không thử' Tương lai > result = (Tương lai >) execService.submit ((Gọi >) nhiệm vụ); '? Bạn cũng có thể đăng bài nếu bạn đã thử một cái gì đó như thế này. – DaGLiMiOuX

+0

Đã thử rất nhiều điều tôi không thể nhớ được nhưng tôi vừa thử nghiệm và như tôi nghi ngờ thay đổi không có gì. Cảnh báo đề cập đến nhiệm vụ '(Callable >)' nhưng khi áp dụng kiểu trả về và lệnh gọi methos không còn bị "bỏ chọn" nữa. – AndRAM

Trả lời

8

Bạn đang sử dụng loại nguyênCallable.

Thay đổi:

public interface CtiGwTask<T> extends Callable 

này:

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

Đó là nó, cảm ơn rất nhiều! – AndRAM

+0

Không vấn đề :) các loại thô là ác và nên tránh bằng mọi giá. – Bohemian

+0

Hoàn toàn đồng ý nhưng tôi phải nói rằng tôi đang thực sự đấu tranh với cú pháp Generics của java :-) – AndRAM

Các vấn đề liên quan