首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在java中用不同的返回类型重写一个方法?

在java中用不同的返回类型重写一个方法?
EN

Stack Overflow用户
提问于 2013-01-25 18:24:15
回答 7查看 34.1K关注 0票数 20

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

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

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

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

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2013-01-25 18:28:57

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

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

票数 27
EN

Stack Overflow用户

发布于 2013-01-25 18:37:44

您的父类已经向外部世界做出了承诺。例如,该方法:

public Price calculatePrice(Items[] items)

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

如果您在子类中增强了该功能,您仍然必须遵守父类对它的原始承诺。

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

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

你甚至可以通过使用更具体的返回类型来改进你父母的承诺:

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

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

票数 12
EN

Stack Overflow用户

发布于 2013-01-25 18:31:38

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

代码语言:javascript
复制
class X implements Cloneable {

    @Override
    protected X clone() {
        try {
            return (X) super.clone();
        } catch (CloneNotSupportedException e) {
            throw new Error(e); // can never happen
        }
    }
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14519797

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档