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

yem*_*rra 0 java inheritance overriding

我可以看到它在我尝试之后不起作用.我无法解释为什么它必须像那样.

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

public String getValue() {
     return "" + b * super.getValue();
}
Run Code Online (Sandbox Code Playgroud)

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

为什么不能使用相同的名称来覆盖该方法?可能出现在我脑海中的唯一一个论点就是它会违反"是一个"关系,因为用A扩展的第二个方法的类必须具有与A相同的能力,并且如果你覆盖了返回打字你打破这个法律吧?

Psh*_*emo 7

这是为了防止这样的情况

class Base {
    public int getValue(){
        return 42;
    }
}
class Derived extends Base{
    public String getValue(){
        return "42";
    }
}
Run Code Online (Sandbox Code Playgroud)

现在应该归还什么?

Base b = new Derived();
int value = b.getValue();
Run Code Online (Sandbox Code Playgroud)

因为b作为Base一种参考,我们应该能够安全地假定那结果getValue将是int,但由于后期绑定(动态绑定)getValue将执行代码Derived类,所以它会返回字符串"42"不是int这会造成问题.


只有当改变返回类型的重写方法是安全的时候才是新的返回类型扩展/实现旧的返回类型

public Fruit getValue(){
    ....    
}
Run Code Online (Sandbox Code Playgroud)

可以用类似的东西覆盖

public Banana getValue(){
    ....    
}
Run Code Online (Sandbox Code Playgroud)