3

次のキャストが機能しない理由について、私は非常に混乱しています。

ScheduledThreadPoolExecutor timeoutControl = (ScheduledThreadPoolExecutor) Executors.newSingleThreadScheduledExecutor();

ScheduledThreadPoolExecutor は、ScheduledExecutorService を実装します。実際のクラスで使用できない場合、このエグゼキューター呼び出しのポイントは何ですか。

私はそれを間違って使用していますか(おそらく)、誰かがガイダンスを提供してもらえますか?

4

3 に答える 3

5

問題は、Executors.newSingleThreadScheduledExecutor();実際には を返さないことScheduledThreadPoolExecutorです。

Executorsクラスのソース コード:

public static ScheduledExecutorService newSingleThreadScheduledExecutor() {
        return new DelegatedScheduledExecutorService
            (new ScheduledThreadPoolExecutor(1));
}

Delegated...クラス ( もありますDelegatedExecutorService) は、すべての呼び出しを基礎となるエグゼキューター (ScheduledThreadPoolExecutorこの場合は ) に渡しているだけです。コード内のコメントは、これらのクラスの全体的なポイントが、基になるエグゼキューターが持つ可能性のあるすべての非インターフェイス メソッドを非表示にすることであることを示唆しています。

いずれにせよ、作業中のオブジェクトのクラス バージョンではなく、インターフェイスを使用することをお勧めします ( and Listnotおよび not )。ArrayListScheduledExecutorServiceScheduledThreadPoolExecutor

ScheduledThreadPoolExecutorで利用できる機能と で利用できない機能が絶対に必要な場合はScheduledExecutorService、 のコンストラクタを使用ScheduledThreadPoolExecutorしてそのインスタンスを作成できます。

于 2012-04-17T22:47:18.023 に答える
4

返されたエグゼキュータを にScheduledExecutorServiceキャストするのではなく、としてのみ使用する必要がありScheduledThreadPoolExecutorます。

ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();
于 2012-04-17T22:44:23.490 に答える
1

単純化するには:

インターフェイスを実装するクラスには、インターフェイスにはない他のメソッドとフィールドを含めることができます。この場合、メソッドはインターフェイスを返すため、これを実装クラスにダウンキャストすることはできません。

于 2012-12-18T11:04:07.623 に答える