实现在接口和父类中声明的方法

时间:2015-10-21 19:42:14

标签: java inheritance

我这里有点困境,

说我有一个班级

public class Child extends Parent implements Interface{
 public static void main(String[] args){
  Child child = new Child();
   child.methodOne(); } }

,其中

abstract class Parent {

public void methodOne()  {
    System.out.print("cannot fly ");
}}

interface Interface {
public abstract void methodOne() throws Exception;}

此结构没有编译错误

如果我这样做的话

abstract class Parent {

public void methodOne() throws Exception {
    System.out.print("cannot fly ");
}}

interface Interface {
public abstract void methodOne(); }

两个恭维错误上升说

Exception Exception in throws clause of Parent.methodOne() is not compatible with Interface.methodOne()

Unhandled exception type Exception

要求在throws方法中添加try/catchmain

为什么会这样?

3 个答案:

答案 0 :(得分:4)

每次实现接口(或从父类重写方法,同样的事情)时,您需要尊重该接口的合同。尊重合同意味着您不能抛出比接口声明更多的异常。

在这两种情况下,Interface都是合同,Parent是实现(通过类Child中发生的两者之间的“绑定”)。

在第一种情况下,界面说methodOne() 允许抛出异常,但不必。您在Parent中的实际实现不会抛出任何内容,因此它是合同的一个子集,并且没问题。

在第二种情况下,接口说methodOne()不会抛出任何东西(*),因此任何实现都不允许抛出任何异常。但是,Parent中的实现要求允许抛出,这与接口契约不兼容;因此编译错误。

另请注意,在第二种情况下,您可以使用空methodOne()声明覆盖Child中的throws,以便签名符合接口合同。然后,您可以拨打super.methodOne()并将Exception重新设为RuntimeException(例如)。

顺便说一下:

  • 如果使用相同的方法签名实现多个接口,则实现只能抛出所有接口的throws声明的交集;
  • 您不需要在接口中使用abstract关键字,因为接口中的方法声明本质上总是抽象的。

(*)当然除了RuntimeException。

答案 1 :(得分:3)

当你这样做时,

public class Child  extends Parent implements Interface
  • 父类正在实现接口。
  • 父类中的methodOne成为重写方法。
  • 正在扩展家长班的孩子,请勿看到此例外。

但是,当您在父exception'中明确抛出class时方法,您必须在从子对象进行调用时处理该异常。

答案 2 :(得分:1)

methodOne()声明不属于界面Interfacethrows合约的一部分。

无论何时实现接口,都必须实现方法契约,如果接口具有throws声明,则可以在不添加Interface声明的情况下执行此操作。

但是,您无法添加 main合同中未说明的功能。

您可以通过修改Exception方法同时抛出 public static void main(String[] args) throws Exception { Child child = new Child(); child.methodOne(); } 来解决其他错误:

methodOne()

或围绕try-catch块中的 public static void main(String[] args) throws Exception { Child child = new Child(); try{ child.methodOne(); }catch(Exception e){ //do something to handle exception i.e. System.out.println(e.getMessage()); } } 来电:

[i for i in range(3)]

补充阅读:Java interface throws an exception but interface implementation does not throw an exception?

摘录:

  

实施和扩展的一般规则是,您可以使新的类或界面“限制性更小”,但不能“限制性更强”。如果您考虑将异常作为限制处理的要求,则不声明该异常的实现限制较少。任何编码到界面的人都不会遇到你班级的问题。