残念ながら、これはできません。宣言された例外はメソッドのシグネチャの一部であり、たとえばそれらを絞り込むことができます
interface FooCallable extends Callable<T> {
T call() throws IOException; // Narrows Exception from the parent interface
}
新しい throws 句を導入したり、宣言された句を拡張したりすることはできません。
Iterator
は基本的な Java インターフェースであり、enhanced for によって使用されます。
for (T obj: ioExceptionThrowingIterable) { ... }
チェックIOException
をキャッチまたはスローする必要があります。
RuntimeException
意見の問題ですが、カスタム サブクラスを使用し、インターフェイスを慎重に文書化する必要があると思います。チェック例外は、それに関連する問題があるため、Spring などの最新のフレームワークでは回避されています。
編集: user949300 の回答から借用して適用すると、返されたオブジェクトを次のようにラップできます。
interface RemoteObject<T> {
T get() throws IOException
}
次に を返し、でアンラップするときにIterator<RemoteObject<T>>
呼び出し元に を処理させます。IOException
get
for (RemoteObject<Foo> obj: iterable) {
try {
foo = obj.get()
} catch (IOException ex) {
/*
* 9 times out of 10, the lazy user just prints the stack trace
* or something else inappropriate
* which is why I despise checked exceptions
*/
}
}
この場合、拡張する必要はなくIterator
、直接使用できます。実際、Collection
該当する場合は を使用できます。