我正在阅读此answer,他提到link,作者解释了为什么我们不应该使用Cloneable。但是,仍然怀疑那里所说的是什么
如果我有一个Cloneable数组,你会认为我可能会崩溃 该数组并克隆每个元素以制作数组的深层副本, 但我不能。 您无法向Cloneable投射内容并调用克隆 方法,因为Cloneable没有公共克隆方法和 对象也没有。如果您尝试强制转换为Cloneable并调用 克隆方法,编译器会说你正在尝试调用 对象上的受保护克隆方法。
但是,我在这里做了
Init s = Init.getInstance(); // getting instance
int count=0;
Cloneable[] v = new Cloneable[5]; // creating array
Init x = s;
Init y = new Init(s);
try {
while (count < 5) {
v[count++] = (Cloneable) s.clone(); // casting it.
}
s.setClassName("Example");
System.out.println(((Init) v[2]).getClassName()); // Displaying.
} catch (CloneNotSupportedException ex) {
ex.printStackTrace();
}
我能够创建Cloneable数组,我做了什么作者说会导致错误或者我误解了作者声明?任何人,请帮助我理解选择Copy Constructor over Cloneable的原因。
答案 0 :(得分:4)
您没有将s
投射到Cloneable
,然后在其上调用clone()
。
相反,您正在调用s.clone()
,然后将结果转换为Clonable
。
您可以这样做,因为s
的类型为Init
,而Init
的格式为public clone()
。
这样做,你会发现编译器大喊,
v[count++] = ((Cloneable) s).clone();
现在假设你要克隆一个数组(你显然只知道它是一个Cloneable
数组。这意味着你不知道它是实际的类型。
Cloneable[] cloneArray = new Cloneable[5];
cloneArray[i] = new Init(); // Let's say it's initialized with different type objects but all `Cloneable`.
for (Cloneable object : cloneArray) {
object.clone(); // Compiler wont allow it. And you don't know what type it is.
}
因此,您基本上无法深度克隆Cloneable数组。