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

2022-09-02 08:56:34

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

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

根据这本书,它还说,当我们尝试重载具有相同方法名称和参数但返回类型不同的方法时,java将引发编译错误,因为签名仅表示方法名称和参数。如果这是真的,我们应该能够重写具有不同返回类型的方法。

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


答案 1

可以返回其他类型,只要它与重写方法的返回类型兼容即可。兼容意味着:它是被覆盖方法返回的类或接口的子类、子接口或实现。

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


答案 2

你的家长班已经向外界做出了承诺。例如,该方法:

public Price calculatePrice(Items[] items).

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

如果在子类中增强该功能,则仍必须保留父类对它的原始承诺。

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

public Price calculatePrice(Items[] items, Integer minimumCharge).

您甚至可以通过使用更具体的回报类型来改善父母的承诺:

public AccuratePrice calculatePrice(Items[] items, Integer minimumCharge).

但你必须至少返回你父母承诺的类型。方法声明中的异常也是如此。