java - 为什么可以改变java中抽象方法的返回类型?

标签 java

为什么允许更改子类中抽象方法的返回类型?

abstract class Animal {
    public abstract Animal assing(Animal a);
}

class Lizard extends Animal {
    @Override
    public Lizard assing(Animal a) {
        return new Lizard();
    }
}

class Chicken extends Animal {
    @Override
    public Chicken assing(Animal a) {
        return new Chicken();
    }
}

而不允许更改参数类型:

abstract class Animal {
    public abstract void foo(int x);
}

class Lizard extends Animal {
    // compiler error
    // the type Lizard must implement the inherited abstract method Animal.foo(int)
    public void foo(float x) {
    }
}

class Chicken extends Animal {
    @Override
    public void foo(int x) {
    }
}

最佳答案

因为,重写方法允许具有 co-variant returnsjava 1.5+版本开始。

此外,当您更改具体类中的参数类型时,您基本上声明了一个全新的方法,该方法与抽象类中定义的抽象方法不同。请记住,您需要(由编译器强制)实现/覆盖扩展抽象类的具体类中的那些抽象方法。

这里简单介绍一下java中的重写方法的规则:

  • 重写的方法和参数列表应完全相同
  • 返回类型应为在父类(super class)中重写的原始方法中声明的子类型(在共变返回的情况下),或者应相同。
  • 与重写方法的访问级别相比,访问级别的限制并不多。例如,当父类(super class)被认为是公共(public)的时,在这种情况下子类中存在的重写方法将不是公共(public)的或私有(private)的。但与重写方法的访问级别相比,访问级别可能没有太多限制。
  • 如果实例方法是由子类继承的,在这种情况下,只有它们可能会被覆盖。
  • 已声明为final的方法可能不会被覆盖。

关于java - 为什么可以改变java中抽象方法的返回类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15405410/

相关文章:

Java修改ArrayList上的Class元素

java - 使用 `UnpooledByteBufAllocator` 时 buf 泄漏正常吗

java - map 如何知道关键是什么

java - ListCellRenderer 未在子组件上触发事件

java - 如何获得给定日期的午夜?

java - Swing Java 中 JComponent 周围奇怪的黑色边框

java - 分页搜索返回的结果数量不正确

java - 直接内存会影响 Java 中的压缩指针吗?

java - 不是所有的父类(super class)都是子类的高级组件,这样说对吗?

Java-图形绘制