为什么允许更改子类中抽象方法的返回类型?
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 returns从java 1.5+版本开始。
此外,当您更改具体类中的参数类型时,您基本上声明了一个全新的方法,该方法与抽象类中定义的抽象方法不同。请记住,您需要(由编译器强制)实现/覆盖扩展抽象类的具体类中的那些抽象方法。
这里简单介绍一下java中的重写方法的规则:
- 重写的方法和参数列表应完全相同
- 返回类型应为在父类(super class)中重写的原始方法中声明的子类型(在共变返回的情况下),或者应相同。
- 与重写方法的访问级别相比,访问级别的限制并不多。例如,当父类(super class)被认为是公共(public)的时,在这种情况下子类中存在的重写方法将不是公共(public)的或私有(private)的。但与重写方法的访问级别相比,访问级别可能没有太多限制。
- 如果实例方法是由子类继承的,在这种情况下,只有它们可能会被覆盖。
- 已声明为final的方法可能不会被覆盖。
关于java - 为什么可以改变java中抽象方法的返回类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15405410/