java - 继承同名但返回类型不同的方法

标签 java inheritance overriding

自从我尝试过以来,我发现它不起作用。我只是无法解释为什么它必须是这样的。

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

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

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

为什么相同的名称不足以覆盖该方法?我想到的唯一论点是,这将违背“is a”关系,因为用 A 扩展的第二个方法的类必须具有与 A 相同的能力,并且如果您重写 return你违反了这条法律,对吗?

最佳答案

这是为了防止出现这样的情况

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,但由于后期绑定(bind)(动态绑定(bind))getValue 将从 Derived 类执行代码,因此它将返回 String "42"不是int,这会导致问题。

<小时/>

更改重写方法的返回类型是安全的唯一情况是新返回类型扩展/实现旧返回类型:

public Fruit getValue(){
    ....    
}

可以用类似的东西覆盖

public Banana getValue(){
    ....    
}

关于java - 继承同名但返回类型不同的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25472585/

相关文章:

c++ - 在 C++ 的模板化子类中继承模板化基类方法而不列出每个方法

java - 为什么我不能使用 Override 注释?

java - 图像绘制在错误的位置

c++ - 无效的协变返回类型错误

java - 如何为非 ID 字段使用序列生成器?

C++ 类访问级别

CSS 类不会覆盖边框样式

java - 如何将信息从重写的 ActionListener 方法发送到 Java 中的 main 方法?

java - 从 MP3 中提取歌词

java - 在 JProfiler 9.2(或更高版本)中是否可以忽略与模式匹配的任何类中具有相同签名的方法?