首页 > 解决方案 > 编译器如何识别覆盖方法的返回类型在 Java 中不兼容?

问题描述

这听起来像是一个重复的问题,但我真的很好奇编译器如何识别被覆盖的方法和覆盖的方法是否具有兼容的类型。正如我们所知,通常使用它们的签名来识别方法,并且签名仅包含方法名称及其参数,因此在重载时可以很容易地确定要选择哪个方法,因此,在重载时我们不能有两个完全相似的方法. 但是对于覆盖,我们需要两个方法相同。那么编译器如何识别返回类型是否兼容呢?

编辑。我非常清楚要执行的方法是根据程序运行时的引用来选择的,我只是对编译器的识别如何工作感到好奇。

标签: javapolymorphismoverriding

解决方案


由于这是一个没有实现 Java 编译器的社区,我们所能做的就是推测,但无论如何,推测这一点,只要客观地完成,可能会成为一本好书。

因此,我的答案将集中在如何验证方法上因为我不知道编译器实际上是如何完成的。

首先,一个很容易检查的是参数个数是否相同。此外,参数的类型和方法的返回类型必须相同,才能完全实现方法覆盖。

我应该提一下,如果在子类中实现了方法的新签名,那不是问题,这是完全合法的。

所以,

class A {
    int foo(long a) { return 0;}
}

class B extends A {
    int foo(long a) { return 0;}
}

class C extends A {
    int foo(double a) { return 0;}
}

是完全合法的。

因此,确定一个方法是否是另一个方法的覆盖对于 Java 了解如何应用基于继承的逻辑很重要,但是您可以轻松地实现具有不同声明但名称相同的方法。


推荐阅读