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?
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
Đã 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