实现基类方法的java方法可以返回一个继承的类吗?

Dav*_*len 5 java inheritance

假设我有继承的Circle和Square类的标准Draw类.有办法做到以下几点吗?也许用泛型?

class Draw {
  public abstract Draw duplicate();
}

class Circle extends Draw {
  public Circle duplicate() {
    return new Circle();
  }
}

class Square extends Draw {
  public Square duplicate() {
    return new Square();
  }
}
Run Code Online (Sandbox Code Playgroud)

rge*_*man 4

是的,重写方法可以返回超类方法返回类型的子类类型。这种技术称为“协变返回类型”,在关于返回类型的 Java 教程的底部进行了描述。这是有效的,因为 aCircle和 aSquareDraws,所以即使您有一个超类引用,并且您不知道或不关心您真正拥有哪个子类,您仍然可以保证返回 a Draw

顺便说一句,要编译代码,您只需将Draw类创建为abstract. 其他一切,包括协变返回类型,看起来都很好。