【发布时间】:2018-12-24 12:13:09
【问题描述】:
我正在尝试找出以下编码中的所有错误。有4个班,
- A:接口
- AImpl:实现 A 的类
- B:C 的父类
-
C:B 的子类
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() { [. . .] } }
这是我的理解,
- A 和 AImpl 都可以,因为 A 是一个接口类,而 AImpl 必须在 A 中实现抽象方法才能履行合同。
- C 类应从 B 类扩展
public class B extends C -
C 类中的
execute()是覆盖方法
问题是我应该如何处理public A doIt()和public AImpl doIt()?接口类可以是返回值吗?
谢谢!
【问题讨论】:
-
覆盖方法
doit()返回被覆盖方法返回的类的子类是完全可以的。这是一种众所周知的模式,称为“返回型协方差”。见stackoverflow.com/questions/10134571/…。但是,doit()没有必要返回一个具体的类,因为它可以返回一个接口。 -
返回类型在覆盖方法中可以更具体,但不能加宽(您可以使用子类型,但不能使用超类型)。所以
AImpl doIt()在 C 中很好,但Object execute()不是。假设你有B b = new C()。当我们调用b.doIt()时,我们希望得到类的some 对象,该对象在某些时候实现A,所以如果C 将返回AImpl,这是可以接受的。但是对于b.execute(),我们希望得到String。如果C将覆盖它以允许 anyObject它还可以返回不能存储在 String 中的 Integer、Animal、Car,因此它会在String s = b.execute();处中断。 -
感谢@Pshemo 的明确解释!现在我明白了:)
标签: java inheritance interface