5

のサブインターフェースを実装するタスクを に送信する方法Callable<T>ExecutorService?

Callable<T>次のように定義されたサブインターフェイスがあります。

public interface CtiGwTask<T>
    extends Callable {

    ...
}

いくつかの静的定数を定義するだけで、メソッドは追加しません。

次に、インスタンスである次のメソッドがexecServiceあり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);
    }
}

残念ながら、これは 2 つのチェックされていない変換と 1 つのチェックされていないメソッド呼び出しの警告を出しています。

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

submit呼び出しを変更すると

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

その後、すべてが機能しているように見えますが、チェックされていないキャストの警告が表示されます。

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

それで、私は何が欠けていますか?submit()Callable のサブクラスのインスタンスに適用すべきではありませんか?

4

1 に答える 1

10

raw Callableタイプを使用しています。

変化する:

public interface CtiGwTask<T> extends Callable

これに:

public interface CtiGwTask<T> extends Callable<T>
于 2013-05-15T12:39:32.180 に答える