我有一个基类,例如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;
}
如何避免未经检查的警告?
最佳答案
Java 5支持协变返回类型,这意味着您可以在每个子类中实现您的deepCopy()
方法以返回特定的子类实例。例如
public class Z extends Base {
@Override
public Z deepCopy() {
}
}
有关协变返回类型here的更多信息。