0

このコードはエラーなしでコンパイルされます。

private FutureTask<MessageSource> loadingTask(final Locale locale)
{
    return new FutureTask<MessageSource>(new Callable<MessageSource>()
    {
        @Override
        public MessageSource call()
            throws IOException
        {
            return loader.load(locale);
        }
    });
}

しかし、Callableインターフェースはこれを定義します:

public V call()
    throws Exception;

オーバーライドがスローすることを宣言できるのはIOExceptionなぜですか?

注:私はすでにグアバなどでそれを見て、それを悪用しCacheLoaderました。

4

2 に答える 2

4

IOException簡単な答え: an is-aであるため、それを行うことができますException

public V call() throws Exception

Exception「このメソッドは、他のチェック例外をスローできません!」という意味です。

このメソッドを次のようにオーバーライドすると:

public MessageSource call() throws IOException

あなたは事実上、「私たちは何でも投げることExceptionができますが、私たちは自発的に自分自身をサブセットIOExceptionとその子だけに制限します」と言っています。

これを行うこともできます:

public Something call()

なしthrows: 「任意の をスローすることは許可されますExceptionが、チェック例外はまったくスローしないことを約束します!」

于 2013-06-06T09:20:18.420 に答える