【发布时间】:2009-09-03 21:53:37
【问题描述】:
我有一个基类,比如Base,它指定了抽象方法deepCopy,还有无数的子类,比如A、B、C、...Z。如何定义deepCopy,使其签名为public X deepCopy(),每个类X?
好的,现在,我有:
abstract class Base {
public abstract Base deepCopy();
}
不幸的是,这意味着如果我有一个来自子类的对象,比如 a 或 A,那么我总是必须为更具体的深层副本执行未经检查的强制转换:
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;
}
如何避免未经检查的警告?
【问题讨论】:
-
有几个实用程序可以为您执行此操作...genericdeepcopy.com 和 code.google.com/p/cloning。
标签: java generics casting unchecked