2012-04-17 5 views
2

私は、次のキャストが動作しない理由として、非常に混乱しています:作成のScheduledThreadPoolExecutor使用エグゼキュー

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

のScheduledThreadPoolExecutorはScheduledExecutorServiceを実装しています。実際のクラスで使用できない場合、このExecutorsコールのポイントは何ですか?

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

答えて

4

問題はExecutors.newSingleThreadScheduledExecutor();が実際にScheduledThreadPoolExecutorを返さないということです。 Executorsクラスの

Source code

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

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

、それはあなたが作業しているというオブジェクトのクラスのバージョンよりもインターフェース(ListないArrayListScheduledExecutorServiceなくScheduledThreadPoolExecutor)を使用することをとにかく良く練習です。

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

をインタフェースを実装するクラスは、インターフェイスにはない、他のメソッドやフィールドを持つことができます:簡単にするために

+0

偉大な、私はそれについて間違った方法を行っていたのを見て、ありがとう!いくつかの考えの後、私は理由を参照してください。 – Constantin

4

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

ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor(); 
+0

私はそれについて考えました。それは意味があります。ありがとうございました。 – Constantin

1

。この場合、このメソッドはインターフェイスを返しますので、実装するクラスにこれをダウンキャストすることはできません。

関連する問題