[英]If the return type is not a part of method signature in Java, why must an overriding method have the same as its parent?
[英]If an instance method in the subclass has the same signature and a DIFFERENT return type, is it a overriding method or a new method?
我是Java的新手,我正在尝试学习“重写方法”的概念作为继承的一部分。
如果子类中的实例方法具有与超类中的方法相同的签名(即名称加上其参数的数量和类型),但它具有DIFFERENT返回类型,那么实例方法是否仍会覆盖超类中的方法? 或者这是一种全新的方法?
不,当你有不同的返回类型时 ,这完全是一种新方法。 没有被覆盖。
返回类型也是方法签名的一部分。 您需要遵守所有要覆盖的规则。
这里有趣的部分是Covariance
考虑您有父子关系并尝试覆盖Child中Parent的方法,Co-variance意味着覆盖方法返回更具体的类型。 下面的示例显示了相同的,返回Object的Parent方法以及Child方法决定返回特定类型(String)的位置,其中String是Object类的子类。 因此这里存在协方差。
协变返回类型:
public class Parent{
public Object doSomething(){}
}
public class Child extends Parent{
public String doSomething() {}
}
如果您有兴趣,请阅读我的博客文章: http : //codeinventions.blogspot.in/2014/11/covariant-contravariant-and-class-invariant-example-and-difference-in-java.html
只有当重写方法的返回类型是重写方法返回的类型的子类型时,才会覆盖它。
overriding方法具有相同的名称,参数的数量和类型,并返回类型作为它覆盖的方法。 重写方法还可以返回由重写方法返回的类型的子类型。 此子类型称为协变返回类型 。 我们举个例子:
子类方法的返回类型R2可能与超类方法的返回类型R1不同,但R2应该是R1的子类型。 即,子类可以返回类型,可以是超类返回类型的子类型。
class ShapeFactory {
public Shape newShape() {}
}
class CircleFactory extends ShapeFactory {
@Override
public Circle newShape() {}
}
对于具有与具有相同参数arity和types的同名父类方法不同的返回类型的方法,如果返回类型是父方法的返回类型的子类型,则它是合法覆盖。 如果没有,那就是编译器错误。
public interface Exemplary
{
CharSequence getText();
}
public class Example implements Exemplary
{
@Override
public String getText(); // legal
}
public class BadExample implements Exemplary
{
@Override
public Integer getText(); // error
}
https://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.4.8.1
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.