この問題は、クラスがインターフェイスTest
を実装していないために発生しCloneable
ます。API仕様に記載されているように、
クラス [..] がインターフェイス Cloneable を実装していない場合、CloneNotSupportedException がスローされます。
修正するには、次のようにしてください。
public class Test implements Cloneable {
...
}
このインターフェースはメソッドを宣言していないため ( のようにマーカーインターフェースCloneable
と呼ばれます)、これ以上何もする必要はありません。クラスのインスタンスを複製できるようになりました。Serializable
Test
ただし、デフォルトの複製メカニズム (つまり、 の複製メカニズムObject
) は、まさに探しているものではない可能性があり、clone()
メソッドをオーバーライドしたい場合があります。デフォルトでは、浅いコピーを作成します。つまり、クラスの新しい個別のインスタンスを取得しますが、両方のインスタンスのフィールドは同じオブジェクトを参照します! 例えば:
class C1 {
Object o;
}
class C2 implements Cloneable {
C1 c1;
}
... main ... {
C2 c2 = new C2();
c2.c1 = new C1();
c2.c1.o = new Object();
C2 c2clone = c2.clone();
System.out.println(c2 == c2clone); // prints false
System.out.println(c2.c1 == c2clone.c1); // prints true
c2.c1.o = new Object(); // modified both c2 and c2clone!!!
最後の行は、c2 と c2clone の両方を変更します。これは、両方が c1 の同じインスタンスを指しているためです。最後の行で c2 のみを変更する場合は、ディープ コピーと呼ばれるものを作成する必要があります。