我读过一本书,书上说,如果一个方法具有相同的签名,我就可以重写它。根据这本书,方法的签名是传递的Method_Name +参数。
按照书中的说法,我可以重写具有不同返回类型的方法。在Java中可以用不同的返回类型覆盖一个方法吗?因为我在网上做了一些搜索,我发现有人说要覆盖一个方法,返回类型也应该是相同的。
根据这本书,它还说,当我们试图用相同的方法名称和参数但不同的返回类型重载方法时,java将抛出编译错误,因为签名只表示方法名称和参数。如果这是真的,我们应该能够用不同的返回类型覆盖一个方法。
请帮助我理解这一点。提前谢谢。
发布于 2013-01-25 18:28:57
您可以返回不同的类型,只要它与被覆盖方法的返回类型兼容即可。兼容意味着:它是被覆盖方法返回的类或接口的子类、子接口或实现。
这是符合逻辑的。如果一个方法返回一个Animal,而您的派生类返回一个Cow,那么您并没有违反超类方法的约定,因为Cow就是一个Animal。如果派生类返回一个Banana,那就不正确了,因为Banana不是Animal。
发布于 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)。
但您必须至少返回父级承诺的类型。方法声明中的异常也是如此。
发布于 2013-01-25 18:31:38
是的,从Java5开始,这是可能的,它被称为协变返回类型。返回类型应该是超类方法返回类型的子类(不允许基元类型)。示例
class X implements Cloneable {
@Override
protected X clone() {
try {
return (X) super.clone();
} catch (CloneNotSupportedException e) {
throw new Error(e); // can never happen
}
}
}https://stackoverflow.com/questions/14519797
复制相似问题