3

私はこの回答を読んでいましたが、彼はリンクに言及しました、著者は、Cloneableを使用すべきではない理由を説明しています。しかし、そこに記載されていることにまだ疑問があります

Cloneable の配列がある場合、その配列を実行し、すべての要素を複製して配列のディープ コピーを作成できると思うかもしれませんが、それはできません。Cloneable には public clone メソッドがなく、 Object もないため、何かを Cloneable にキャストして clone メソッドを呼び出すことはできません。Cloneable にキャストして clone メソッドを呼び出そうとすると、コンパイラはオブジェクトに対して保護された 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 配列を作成することができました、そして私は作者がエラーを引き起こすと言ったことをしましたか、または私は作者の声明を誤解しましたか? 誰でも、CloneableではなくCopy Constructorを選択する理由を理解するのを手伝ってください。

4

1 に答える 1

4

あなたはそれにキャストsCloneableてから呼び出しclone()ていません。

代わりに、呼び出しs.clone()てから、結果を にキャストしていClonableます。これができるsのは、 is 型InitInithaspublic clone()メソッドがあるためです。

代わりにこれを行うと、コンパイラが叫んでいることがわかります。

 v[count++] =  ((Cloneable) s).clone();

ここで、配列を複製したいとしましょう (明らかに、それがCloneable配列であることだけを知っています。つまり、それが実際の Type.

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 に答える