[英]Can a java method implementing a base class method return an inherited class?
假设我有继承的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();
}
}
是的,你可以从Java 5开始。
从Java 5开始,子类中的方法可能返回一个对象,该对象的类型是由超类中具有相同签名的方法返回的类型的子类。 ( 来源 )。 这称为协变返回类型。
是的,可以让重写方法返回一个类型,该类型是超类方法的返回类型的子类。 这种称为“协变返回类型”的技术在返回类型的Java教程的底部进行了描述。 这是因为Circle
和Square
都是Draw
,所以即使你有一个超类引用,并且你不知道或不关心你真正拥有哪个子类,你仍然可以保证得到Draw
。
顺便说一句,要使代码编译,只需要将Draw
类abstract
。 其他一切,包括协变返回类型,看起来很好。
我会在这里使用泛型:
class Draw<T> {
public abstract T duplicate();
}
class Circle extends Draw<Circle> {
@Override
public Circle duplicate() {
return new Circle();
}
}
class Square extends Draw<Square> {
@Override
public Square duplicate() {
return new Square();
}
}
我想你想做的是以下几点:
public abstract class Draw<T extends Draw> {
public abstract T duplicate();
}
public class Circle extends Draw<Circle> {
@Override
public Circle duplicate() {
return new Circle();
}
}
public class Square extends Draw<Square> {
@Override
public Square duplicate() {
return new Square();
}
}
T
约束,应该扩展Draw
,以避免奇怪的继承,例如Circle extends Draw<List>
) abstract
关键字添加到Draw
类 然后,您可以执行以下操作:
Square originalSquare = new Square();
Circle originalCircle = new Circle();
Square duplicatedSquare = originalSquare.duplicate();
Circle duplicatedCircle = originalCircle.duplicate();
编辑
没有泛型,你可以做这样的事情:
public abstract class Draw {
public abstract Draw duplicate();
}
public class Circle extends Draw {
@Override
public Circle duplicate() {
return new Circle();
}
}
public class Square extends Draw {
@Override
public Square duplicate() {
return new Square();
}
}
感谢Pavel,rgettman和Enno Shioji,我不知道“协变返回类型”。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.