【发布时间】:2019-12-16 19:52:06
【问题描述】:
想象一下超A类:
public class A {
private int x;
A(int x){
this.x = x;
}
public int getX() {
return x;
}
}
它是 2 个子类 B 和 C:
public class B extends A{
private int y = 2;
B(int x){
super(x);
}
}
public class C extends A{
private int y = 3;
B(int x){
super(x);
}
}
现在想象一个所有继承类 A 的对象列表。我想遍历该列表并克隆每个对象,并将其转换为它的原始子类(B 或 C)。这就是我尝试这样做的方式:
public static void main(String args[]) {
ArrayList<A> aList = new ArrayList<A>();
aList.add(new B(5));
aList.add(new C(6));
ArrayList<A> aClones = new ArrayList<A>();
for(A a : aList) {
A aNew = new A(a.getX());
a.getClass().cast(aNew);
aClones.add(aNew);
}
}
但这给了我一个错误,说我不能将 A 转换为 B。如果不事先知道我正在处理的对象的子类型,我怎么能做到这一点?我可以在 for 循环中为每种类型的子类做一个 if 语句来检查 a 是否是该子类的一个实例,然后简单地创建该特定子类的一个新实例并以这种方式克隆它。但是,在我的情况下,将有更多的子类,而不仅仅是 B 和 C,而且可能还会出现更多。我不希望 for 循环包含有关 A 的现有子类的任何知识。这可能吗?
【问题讨论】:
标签: java casting clone cloning