我有一个基类,例如Base,它指定了抽象方法deepCopy,还有许多子类,例如ABC,... Z。如何定义deepCopy,以便每个类public X deepCopy()的签名为X

现在,我有:

abstract class Base {
  public abstract Base deepCopy();
}


不幸的是,这意味着,如果我有一个子类的对象,例如aA,那么我总是必须执行未经检查的强制转换以获取更具体的深层副本:

A aCopy = (A) a.deepCopy();


有没有办法避免使用强制转换?我想保证任何深层副本都返回相同运行时类的对象。

编辑:让我扩展我的答案,因为协变类型是不够的。说,然后我想实现一个类似的方法:

static <N extends Base> List<N> copyNodes(List<N> nodes) {
    List<N> list = Lists.newArrayList();
    for (N node : nodes) {
      @SuppressWarnings("unchecked")
      N copy = (N) node.deepCopy();
      list.add(copy);
    }
    return list;
  }


如何避免未经检查的警告?

最佳答案

Java 5支持协变返回类型,这意味着您可以在每个子类中实现您的deepCopy()方法以返回特定的子类实例。例如

public class Z extends Base {
  @Override
  public Z deepCopy() {

  }
}


有关协变返回类型here的更多信息。

09-28 09:39
查看更多