繁体   English   中英

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

[英]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教程的底部进行了描述。 这是因为CircleSquare都是Draw ,所以即使你有一个超类引用,并且你不知道或不关心你真正拥有哪个子类,你仍然可以保证得到Draw

顺便说一句,要使代码编译,只需要将Drawabstract 其他一切,包括协变返回类型,看起来很好。

我会在这里使用泛型:

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();
    }
}
  1. 使用泛型(对T约束,应该扩展Draw ,以避免奇怪的继承,例如Circle extends Draw<List>
  2. 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.

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