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

在java中重写具有不同返回类型的方法?

黄景胜
2023-03-14

我读过一本书,它说我可以覆盖一个方法,如果它有相同的签名。根据这本书,方法的签名是Method_Name参数传递。

根据这本书,我可以重写具有不同返回类型的方法。在Java中,是否可以用不同的返回类型重写方法?因为我在网上做了一些搜索,我发现有人说要覆盖一个方法,返回类型也应该相同。

根据这本书,它还说,当我们试图用相同的方法名和参数重载一个方法,但返回类型不同时,java会抛出编译错误,因为签名只表示方法名和参数。如果这是真的,我们应该能够重写具有不同返回类型的方法。

请帮助我理解这一点。提前谢谢。

共有3个答案

鲜于海
2023-03-14

是的,这是可能的,因为Java5,它被称为协变返回类型。返回类型应该是超类方法返回类型的子类(不允许使用基元类型)。实例

class X implements Cloneable {

    @Override
    protected X clone() {
        try {
            return (X) super.clone();
        } catch (CloneNotSupportedException e) {
            throw new Error(e); // can never happen
        }
    }
}
长孙昀
2023-03-14

你的家长班级向外界做出了promise。例如,方法:

公共价格计算价格(项目[]项目).

它告诉世界期待一个价格。

如果您在子类中增强了该功能,您仍然必须保持父类对它的原始promise。

您可以添加重载的计算方法:

公共价格计算价格(项目[]项目,整数最小收费)

您甚至可以通过使用更具体的回报类型来改善家长的promise:

public AccuratePrice calculatePrice(Items[]Items,整数最小费用)

但您必须至少返回您的家长promise的类型。方法声明中的异常也是如此。

施飞昂
2023-03-14

您可以返回不同的类型,只要它与重写方法的返回类型兼容。兼容意味着:它是重写方法返回的类或接口的子类、子接口或实现。

这是合乎逻辑的。如果一个方法返回一个Animal,而您的派生类返回一个Cow,那么您并没有违反超类方法的约定,因为Cow是一个Animal。如果派生类返回一个香蕉,那就不正确了,因为香蕉不是动物。

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

  • 问题内容: 重写的方法可以有不同的返回类型吗? 问题答案: Java支持*协变返回类型的重写方法。这意味着重写的方法可能具有更特定的返回类型。也就是说,只要新的返回类型可分配给你要覆盖的方法的返回类型,就可以使用。 例如: 这在Java语言规范的8.4.5节中指定: 如果返回类型是引用类型,则返回类型在彼此覆盖的方法之间可能会有所不同。返回类型可替换性的概念支持协变返回,即返回类型到子类型的特殊化

  • 重写的方法可以有不同的返回类型吗?

  • 问题内容: 为什么仅通过更改返回类型就不可能重载函数?将来的Java版本会改变吗? 顺便说一句,仅供参考,这在C ++中可能吗? 问题答案: 你无法在Java中做到这一点,也无法在C ++中做到这一点。基本原理是,仅返回值不足以使编译器确定要调用的函数:

  • 只是延伸问题... 抽象类和接口中的相同方法 假设一个类实现了一个接口并扩展了一个抽象类,两者都有相同的方法(名称签名),但返回类型不同。现在,当我重写方法时,只有当我使返回类型与接口声明相同时,它才会编译。 另外,如果该方法在抽象类或接口中声明为private或final,会发生什么情况? **旁注。在一次采访中,爱因斯坦先生在这个问题上坚持了相当长的时间。有没有一个流行的场景,我们这样做,或者

  • 我正在尝试实现和重写具有不同返回类型的方法,而不会被迫转换返回类型。 我的问题:是否可以在不强制强制转换的情况下返回不同的类型?解决这个问题的抽象方法看起来怎么样? 我认为必须有一个解决方案,因为编译器应该知道返回类型...