java - 我们可以通过更改 Java 中的返回类型(协变返回类型)来覆盖方法。为什么?
问题描述
在 Java 中不能通过改变返回类型来重载方法,但是我们可以通过改变返回类型(协变返回类型)来覆盖方法。为什么?
更具体地说,JVM 使用方法的完整签名进行查找/解析。完整签名意味着它除了参数类型之外还包括返回类型。即,一个类可以有两个或多个仅在返回类型上有所不同的方法。javac 使用这个事实来实现协变返回类型。
那么为什么我们不能重载使用协变返回类型的方法呢?
解决方案
答案可能听起来很幼稚,但我认为如果您不使用函数调用的返回值,这样做会使编译器混淆您尝试使用哪个函数。
int foo(int a, int b) {...}
double foo(int a, int b) {...}
// calling one of the function and not using return value
foo(3,4);
编译器在生成类文件时,在编译文件中具有完整的方法签名(包括返回类型和包名),以唯一标识确切的函数。如果允许使用不同的返回类型进行重载,那么编译器将无法决定使用哪个函数,前提是您没有使用返回值。
推荐阅读
- sql - 计算每小时的最大和最小 id 数
- xamarin.forms - Xamarin 在 DataTemplate ViewCell 中形成 XAML 绑定错误
- java - 逻辑相等的 SQL 解析
- reactjs - 在 Reactjs 中使用 useEffect 卸载组件时执行调度功能
- r - 在 ggplot2 标题中使用时,R 中的胶水函数没有打印正确的值
- git - Git 的 --no-verify 选项
- c# - 带有来自.Net 5中完整字符串的查询参数的正则表达式URL
- c# - 在 linq 中使用 if-else 创建字符串文本
- c# - 如何为每个请求添加公共标头(Swagger 和 Swashbuckle)
- spring-cloud - 如何在 SpringGateway ServerWebExchange 中设置属性