当前位置: 首页 > 知识库问答 >
问题:

如果返回类型不是Java中方法签名的一部分,为什么重写方法必须与其父方法具有相同的返回类型?

令狐建修
2023-03-14

Java不允许通过更改子类的返回类型来重写方法,有什么特别的原因吗?

由于返回类型不是方法签名的一部分,编译器不认为具有不同返回类型(但具有相同名称、相同数量和类型的参数)的方法是相同的吗?

共有1个答案

朱宏爽
2023-03-14

Java语言规范不将返回类型视为方法签名。

由于返回类型不存在于签名中,所以这两个方法不能仅因返回类型而有所不同(因为它们对运行时来说是不明确的)。所以编译器不允许这样做。

这可以按照泛型参数的类型擦除来考虑。由于类型在运行时不可用,编译器将阻止签名(参数)仅因泛型类型而异的任何两个方法,以避免在运行时出现歧义。

类似地,在方法签名中不考虑异常,因此两种方法不能仅因异常而不同。编译器将不允许这样做。

类似地,在方法签名中不考虑访问修饰符,因此这两种方法不能仅因访问修饰符而异。编译器将不允许这样做。

因此,基础是,两个方法不能仅因不属于方法签名的组件而变化。

基本上,编译器是用来根据JLS语法解析程序,并阻止任何不遵循该语法的内容。编译器确实有豪华的空间来容纳一些偏差。但它不会完全允许违规。

所有这些都是为了确保运行时能够基于编译器的输出以更高的可信度更自由地执行。

参考:文件

参考:JLS

If R1 is void then R2 is void.

If R1 is a primitive type, then R2 is identical to R1.

If R1 is a reference type then:

R1 is either a subtype of R2 or R1 can be converted to a subtype of R2 by unchecked conversion (§5.1.9), or

R1 = |R2|

参考:JLS

 类似资料:
  • 问题内容: 我读过一本书,说如果签名相同,我可以覆盖一个方法。根据书中的方法签名是Method_Name + Parameters传递的。 根据这本书,我可以重写具有不同返回类型的方法。在Java中实际上是否可以覆盖具有不同返回类型的方法?因为我在网上进行了一些搜索,所以我发现有人说要覆盖方法,返回类型也应该相同。 根据这本书,它还说,当我们尝试重载具有相同方法名称和参数但返回类型不同的方法时,j

  • 我读过一本书,它说我可以覆盖一个方法,如果它有相同的签名。根据这本书,方法的签名是Method_Name参数传递。 根据这本书,我可以重写具有不同返回类型的方法。在Java中,是否可以用不同的返回类型重写方法?因为我在网上做了一些搜索,我发现有人说要覆盖一个方法,返回类型也应该相同。 根据这本书,它还说,当我们试图用相同的方法名和参数重载一个方法,但返回类型不同时,java会抛出编译错误,因为签名

  • 问题内容: 它返回此错误:此方法必须返回boolean类型的结果。我究竟做错了什么? 问题答案: 现在,不能保证该函数返回a ,因为很可能不会输入任何一条语句。 您可以像这样修复它(但 只有 在您的逻辑确实需要它的情况下 才 这样做):

  • 为什么我的子类方法不重写其父类中相同签名的方法? 我有一个类,它扩展了一个抽象类,后者扩展了抽象类Actor(这里的上下文是一个pong游戏)。和都有一个具有相同签名的方法: 目的是让方法重写的方法。这里的问题是,当我在内部调用时,只调用的方法。 在中的上设置的断点会脱扣,而在中的上设置的断点从不脱扣。我还在方法上尝试了,但它仍然调用方法。 目标是让对象以与其他对象不同的速度上下移动。因此方法也会

  • 为了方便起见,我将setter方法返回类型更改为对象,例如: 但在tomcat做出这一改变之后 PropertyNotFoundException: 为了消除这个异常,我将修饰符从private更改为public,但仍然得到相同的错误。所以我有两个问题; null

  • 我在一次面试中被问到以下问题: 问题:名称和签名相同但返回类型不同的方法。他问我,可能吗?这种类型叫什么。 有人能告诉我以下情况吗: > 上面的事情在任何情况下都是可能的(至少像一个在基类中,一个在派生类中?)如果是,是什么类型?比如编译或运行时多态? 在编译时多态性中,如果方法的返回类型与签名也不同,该怎么办?但只有函数的名称是相同的。还是编译时多态性吗? 在重写中,如果我有不同的返回类型,但方