首页 > 解决方案 > 我们可以通过更改 Java 中的返回类型(协变返回类型)来覆盖方法。为什么?

问题描述

在 Java 中不能通过改变返回类型来重载方法,但是我们可以通过改变返回类型(协变返回类型)来覆盖方法。为什么

更具体地说,JVM 使用方法的完整签名进行查找/解析。完整签名意味着它除了参数类型之外还包括返回类型。即,一个类可以有两个或多个仅在返回类型上有所不同的方法。javac 使用这个事实来实现协变返回类型。

那么为什么我们不能重载使用协变返回类型的方法呢?

标签: javaoop

解决方案


答案可能听起来很幼稚,但我认为如果您不使用函数调用的返回值,这样做会使编译器混淆您尝试使用哪个函数。

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);

编译器在生成类文件时,在编译文件中具有完整的方法签名(包括返回类型和包名),以唯一标识确切的函数。如果允许使用不同的返回类型进行重载,那么编译器将无法决定使用哪个函数,前提是您没有使用返回值。


推荐阅读