不幸的是,你不能这样做。声明的异常是方法签名的一部分,虽然您可以缩小它们,例如
interface FooCallable extends Callable<T> {
T call() throws IOException; // Narrows Exception from the parent interface
}
您不能引入新的 throws 条款或扩大声明的条款。
Iterator
是一个基本的 Java 接口,由增强的 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
如果适用,您可以使用 。