我正在使用Java 7并且遇到了一些非常有趣的东西。在使用我自己的接口扩展java.lang.Appendable接口的同时,为了文档目的,我明确地重写每个方法。
java.lang.Appendable中定义的所有三个方法抛出IOException,我认为我的重写方法也必须声明。但是,我最终删除了一个重写方法的throws子句,奇怪的是Java 7编译器没有抱怨丢失的声明。所以我继续从其他两种方法中删除了throws子句,并且再次没有来自编译器的抱怨。
那为什么我可以覆盖接口中的方法并删除它的throws子句呢?什么时候这种现象在Java中变得合法?
答案 0 :(得分:4)
父接口声明方法可能抛出异常。不抛出异常的实现符合可能的实现。您的接口声明实现实际上不会抛出异常,同时仍然遵守父接口的约定。
将实例分配给Appendable
变量的代码必须按定义捕获异常,而将您的实例视为子接口的代码则不必。
简单地说:
interface Foo {
void m() throws Exception;
}
interface Bar extends Foo {
@Override
void m();
}
void test(Foo foo, Bar bar) {
foo.m(); // must catch exception
bar.m(); // no exception declared to be thrown, so don't need to catch
}
另请注意,它是变量的类型,而不是重要的对象:
Foo foo = new BarImpl();
foo.m(); // must catch exception