如何在Java类层次结构中实现泛型类型安全的深度克隆?

nam*_*min 2 java generics casting unchecked

我有一个基类,说Base这规定了抽象的方法deepCopy,和子类,比如无数A,B,C,... Z.如何定义deepCopy以使其签名适用public X deepCopy()于每个类X

对,现在,我有:

abstract class Base {
  public abstract Base deepCopy();
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,这意味着,如果,如果我有从子类的对象,说aA话,我总是有一个更具体的深层副本执行未经检查的转换:

A aCopy = (A) a.deepCopy();
Run Code Online (Sandbox Code Playgroud)

有没有办法,也许使用泛型,以避免施法?我想保证任何深层副本都返回同一运行时类的对象.

编辑:让我扩展我的答案,因为协变打字是不够的.说,然后我想实现一个方法,如:

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;
  }
Run Code Online (Sandbox Code Playgroud)

我怎么能避免未经检查的警告?

Ada*_*ski 5

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

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

  }
}
Run Code Online (Sandbox Code Playgroud)

更多关于协变返回类型的信息.