我正在使用Java 7,并遇到了一些非常有趣的事情。在用自己的接口扩展java.lang.Appendable接口时,为了文档的目的,我要显式地覆盖每个方法。
java.lang.Appendable中定义的所有三个方法都抛出IOException,我认为我的重写方法也必须声明该方法。但是,我最终删除了重写方法之一上的抛出子句,奇怪的是,Java 7编译器没有抱怨缺少的声明。因此,我继续从其他两个方法中删除了抛出子句,而且编译器也没有抱怨。
那么,为什么我可以重写接口中的方法并删除它的抛出子句呢?这一现象何时在Java中成为合法的?
发布于 2016-08-29 23:51:31
父接口声明该方法可能引发异常。不抛出异常的实现符合可能的实现。您的接口声明实现实际上不会抛出异常,同时仍然坚持父接口的约定。
将实例分配给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 exceptionhttps://stackoverflow.com/questions/39216736
复制相似问题