3

我正在阅读这个答案,他提到了一个链接,作者解释了为什么我们不应该使用 Cloneable。但是,仍然怀疑那里所说的内容

如果我有一个 Cloneable 数组,您会认为我可以运行该数组并克隆每个元素以制作该数组的深层副本,但我不能。您不能将某些内容强制转换为 Cloneable 并调用 clone 方法,因为 Cloneable 没有公共克隆方法, Object 也没有。如果您尝试强制转换为 Cloneable 并调用 clone 方法,编译器会说您正在尝试在对象上调用受保护的克隆方法。

但是,在这里我做到了

        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 数组并且我做了作者所说的会导致错误或者我误解了作者的陈述?任何人,请帮助我理解选择复制构造器而不是克隆的原因。

4

1 回答 1

4

你不是投射sCloneable然后调用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 数组。

于 2015-07-24T06:04:46.120 回答