2016-11-21 8 views
0

私はjava.util.concurrent.AbstractExecutorServiceから派生したクラスを持っています。私のクラスはshutdownNow()を上書きします。すべてがコンパイルされ、正常に動作します。@NonNullByDefault戻り値の型がExecutorService.shutdownNow()から返された 'List <Runnable>'と互換性がありません(null制約が一致しません)

私はクラスに[email protected]を追加しました。 shutdownNow()に1つのエラー以外のすべてのエラーと警告を修正することができました。エラーメッセージは、戻り値の型は、()

クイックフィックスは、任意のヘルプはありません(NULL制約不一致)ExecutorService.shutdownNowから返された「リスト」と互換性がありません

...と言います。

ここに問題のコードがあります。

@NonNullByDefault // Adding this causes an error 
public abstract class ShutdownThreadPool extends AbstractExecutorService implements ExecutorService 
{ 
    @Override 
    public List<Runnable> shutdownNow() // The error is on this line 
    { 
     return(Collections.emptyList()); 
    } 
} 

注:Collections.emptyList()は問題ではありません。これは、同じエラーメッセージを再現する実際のコードを単純化したものです。

コードのイメージは次のとおりです。

enter image description here

答えて

1

右、ExecutorServiceはどんな@NonNullByDefaultの範囲内にないようですか?

さらに、ExecutorServiceList<Runnable> shutdownNow()と宣言する。

ただし、無効化は@NonNullByDefaultの有効な署名@NonNull List<@NonNull Runnable> shutdownNow()の影響を受けます。

我々はExecutorService.shutdownNow()の意図した意味を知らない:クライアントがNULL可能か、NULL以外の期待すべきtype引数Runnable上の注釈が実際に非互換性の原因になっているのに対し、残念ながら、クイックフィックスのみ、最初の@NonNullについて

返されるリストの要素List<@NonNull Runnable>nullを結果リストに挿入するのを好むshutdownNow()の潜在的な発信者を壊していると仮定すると(これは奇妙なデザインを無視している)

このオーバーライドタイプを安全にするには、まずスーパーインターフェース(この場合は外部アノテーションを使用)にヌルアノテーションを導入してから、実装をスイートに従わせる必要があります。

スーパーインタフェースに注釈をつけることは要求される「レガシー」タイプList<Runnable>を続ける、すなわち、何らかの理由で実行可能でない場合は、nullのデフォルトは、それがどこにある@NonNullを追加し、手動で@NonNullByDefault({})を言って、とすることで、この1つの方法でキャンセルすることができます依然として望ましい。

関連する問題