此代码中的继承错误是什么?

时间:2019-07-06 11:15:31

标签: java oop inheritance interface

我正在研究Java的旧考试题,但我无法弄清楚这一题:

已声明的类之一无法编译...

  1. 您将更改哪些内容以编译类?

  2. 假设正确纠正了编译错误,输出将是什么?简要说明您的答案。

我认为这将是C类,我想是因为它没有应用适当的OOP原则,但是有人可以帮我更好地解释它吗?

public interface A {

  public void doSomeProcess(String s);

}

public class AImpl implements A {

  public void doSomeProcess(String s) { 
         System.out.println("A Imple Code"); [. . .] }
}

public class B {
       public A doIt() { [. . .] }

       public String execute() { [. . .] }
}

public class C extends B {

       public AImpl doIt() { [. . .] } 

       public Object execute() { [. . .] }
}

1 个答案:

答案 0 :(得分:1)

您的B#execute()返回类型为String,而C#execute()方法的返回类型为Object。覆盖B#execute()时,您只会返回String的子类型,而不会返回更通用的子类型。

考虑一下,由于CB的子类,因此可以随时替换B。但是,如果C#execute()可以返回说DateIntegerObject,那么这种替换就不会发生。因此,在重写方法的情况下,您可以返回子类型,但不能返回超类型。

另一方面,被覆盖方法的参数可以是其父类方法参数的超类型。它们不能是子类型。

例如
父类public Map doThis(List n)中的方法在被重写时必须处理至少为List的内容(例如Collection),并且可以返回最多为Map的内容(说HashMap
因此,此方法public HashMap doThis(Object k)可以覆盖此方法,因为它必须至少处理List并返回Map