2016-12-05 4 views
0

私はCloneableインターフェイスを実装しているパッケージからクラス(BaseClassと呼ぶ)を使用していますが、super.clone()を呼び出すのではなく、新しいオブジェクトを作成しているようです。私はこのBaseClassのSubClassを作ってしまい、それをクローンしようとするとクラッシュします。java Cloneable:ベースクラスが間違って実装しています。何をすべきか?

// from library 
class BaseClass implements Cloneable{ 
    public void clone(){ 
    BaseClass clone = new BaseClass(); // I guess? 
    ... 
    return clone; 
    } 
} 

// my subclass 
class SubClass extends BaseClass{ 
    public void clone() throws CloneNotSupportedException { 
    return (SubClass) super.clone(); // throws ClassCastException 
    } 
} 

一つの方法は、BaseClassのを拡張スキップして、それは本当に私のコードが複雑になるもののちょうど、ポインタを使用することです:コードでは、私はこのような何かを持っています。

実際にコピーを作成する必要がある場合はどうすればよいですか?正確なBaseClassのクローン()メソッドを見ずに

おかげ

+1

基底クラスが間違っていると 'クローン()'の契約に違反します。あなたはそれを修理するようにメンテナーに伝える立場にいますか? – Nayuki

+0

私はそれが放棄されていることを恐れている – user6502063

+0

さて、残念ながら、 'Object.clone()'に直接バイパスするオプションはありません:http://stackoverflow.com/questions/3456177/calling-super-super-class-method – Nayuki

答えて

0

は、I /我々は確かにこれに答えることはできません。しかし、私が教えておきたいのは、Objectにあるデフォルトのクローンメソッドが、新しいオブジェクトにクローンされているオブジェクトからすべてのフィールドをコピーするということです。場合によっては、元のクローンポイントとクローンポイントの両方を同じObjectにするのではなく、参照されたオブジェクトをクローンするためにこの機能をオーバーライドすることもできます。あなたのSubClass.cloneで

+0

ありがとう。私はポインタで新しいクラスを作った。また、ポインタを一時的にしてSerializableを実装できるようにしました。それは少なくとも動作します:) – user6502063

0

は、(super.cloneを呼び出す)が、新しいサブクラスをあなたの自己を作成しないでください:

public void clone(){ 
    SubClass clone = new SubClass(); 
    //copy properties from this to clone 
    return clone; 
    } 
+0

はい、あなた自身の間違った実装を行うことによって間違った基本クラスの実装を回避しようとしています。うん。 (ただし、SubClassがfinalの場合は技術的には正しかったでしょう) – Nayuki

+0

これは状況に応じてきれいなアプローチですが、元のオブジェクトには、あまりにも多くの情報が含まれているため、誤ってフィールドをコピーする危険性がありません。しかし、ありがとう。今のところ、オブジェクトをラップするだけのクラスを選択しました – user6502063

関連する問題