java - 编译器如何识别覆盖方法的返回类型在 Java 中不兼容?
问题描述
这听起来像是一个重复的问题,但我真的很好奇编译器如何识别被覆盖的方法和覆盖的方法是否具有兼容的类型。正如我们所知,通常使用它们的签名来识别方法,并且签名仅包含方法名称及其参数,因此在重载时可以很容易地确定要选择哪个方法,因此,在重载时我们不能有两个完全相似的方法. 但是对于覆盖,我们需要两个方法相同。那么编译器如何识别返回类型是否兼容呢?
编辑。我非常清楚要执行的方法是根据程序运行时的引用来选择的,我只是对编译器的识别如何工作感到好奇。
解决方案
由于这是一个没有实现 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 了解如何应用基于继承的逻辑很重要,但是您可以轻松地实现具有不同声明但名称相同的方法。
推荐阅读
- mongoose - Passport 不会返回用户名和密码以外的字段
- python - 根据 django 中是否喜欢照片来更改按钮
- android - notifyListener 的奇怪行为
- matlab - Matlab使用VM的vCPU进行并行循环
- amazon-web-services - 带有 AWS API 网关的 AWS Route 53
- react-native - ReferenceError:元素未定义。当我尝试运行 ios 测试时遇到这个问题,以 jest 作为测试运行器反应本机
- sql - 如何在sql server中创建希腊东正教复活节日历?
- python - 从串口写入数据时如何跳过第一行?
- vue.js - 更改后将状态绑定到另一个 div (VueJS)
- javascript - AngularJS 做应用程序。编辑按钮问题