我需要创建一个数组内容的副本,数组内容由不同类型的各种Object组成,但是我不能使用显式强制转换来检查Object的类型,也不能使用可克隆接口/arraycopy方法。
首先,我创建了一个超类,所有其他类都从这个超类扩展而来,但我不确定如何使用特定类的复制构造函数。
public Building(Object obj) {
try {
this.windows= ((House)obj).windows;
this.basement = ((House)obj).basement;
} catch (ClassCastException ex) {
this.windows = 0;
this.basement = false;
}
... (various other try-catch blocks here)
}
驱动程序为:
public static Building[] copyBuildings(Building[] objects) {
Building[] objList = new Building[objects.length];
for (int i = 0; i < objects.length; i++) {
objList[i] = new Building(objects[i]);
}
return objList;
}
但是,这并没有像我希望的那样正确地调用子类的复制构造函数,因为它根本没有引用它们,我不知道如何继续。
请记住,没有显式类型转换,如果我在运行时不知道对象的显式类型,是否可以调用Object的复制构造函数(是否需要修改当前代码)?或者多态性不以这种方式工作?
任何帮助都将不胜感激!(以及一般的反馈,我真的不习惯使用stackoverflow)
1条答案
按热度按时间brvekthn1#
显然,您有一个包含各种
Building
子类型的Building[]
,并且您希望创建一个深副本。不能通过实现
Building
复制构造函数来完成此操作。为什么?
因为
Building
的构造函数 * 只能 * 构造Building
示例。它 * 不能 * 构造House
示例...或Hotel
或Church
或...然而,有各种各样的替代品 * 将 * 工作:
Building
及其每个子类型中实现Cloneable
。Building
,让它使用instanceof
(或Java18+模式开关)来区分子类,然后为每个子类使用合适的构造函数;例如:每种选择都有优点和缺点,我们不能建议哪种选择对每个用例最好,当然,没有一种选择对所有用例都是完美的。