继承具有相同名称但返回类型不同的方法

时间:2014-08-24 14:11:22

标签: java inheritance override

我可以看到,自从我尝试它以后它没有用。我无法解释为什么它必须像那样。

public int getValue() {
     return 2 * a;
}

public String getValue() {
     return "" + b * super.getValue();
}

第二种方法来自一个类,它是实现第一个getValue()方法的类的子类。

为什么不能使用相同的名称来覆盖该方法?可能出现在我脑海中的唯一一个论点就是反对"是一个" -relation,因为用A扩展的第二个方法的类必须具有与A相同的能力,并且如果你覆盖了那种违反法律规定的回报类型,对吗?

2 个答案:

答案 0 :(得分:6)

这是为了防止这样的情况

class Base {
    public int getValue(){
        return 42;
    }
}
class Derived extends Base{
    public String getValue(){
        return "42";
    }
}

现在应该归还什么?

Base b = new Derived();
int value = b.getValue();

由于bBase类型引用,我们应该能够安全地假设getValue的结果为int,但由于后期绑定(动态 - 绑定)getValue将执行来自Derived类的代码,因此它将返回String "42"而不是int,这将导致问题。


只有在更改返回类型的重写方法时才会安全的情况是当新的返回类型扩展/实现旧的返回类型时

public List<SomeType> getValue(){
    ....    
}

可以用

之类的东西覆盖
public ArrayList<SomeType> getValue(){
    ....    
}

答案 1 :(得分:0)

因为在Java中,方法签名包含它的名称和参数类型。您不能拥有两个具有相同签名的方法。

阅读有关定义方法的this Oracle tutorial

至于为什么;例如,当我这样做时会发生什么:

final Object object = getValue();