繁体   English   中英

如果子类中的实例方法具有相同的签名和DIFFERENT返回类型,那么它是重写方法还是新方法?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM