コピー コンストラクターとオーバーライドされた clone() メソッド (同じクラス内ではない) を作成および実装する方法を理解するのに苦労しています。
「実際のコピー」の場合、単純なクローンではなくディープクローンを作成する必要があることを私は知っています(理解するのに長い時間がかかりました...)。私がここで見つけた (私にとって) 最も明白な解決策の 1 つは、コピー コンストラクターを作成することでした。
簡潔にするために、2 つの整数を保持する Dog オブジェクトがあるとします。別のクラス Cat には、100 個の Dog オブジェクトの配列で構成される Cat オブジェクトがあります (例: Dog[] cat = new Dog[100])。これまでに次のことを試しました。
// for a copy constructor
public Cat(Cat cat) {
Dog[] copy = new Dog[100];
for (int i = 0; i < 100; i++) {
copy[i] = cat[i];
}
}
そのようなものは常に型の不一致をもたらします (「式の型は配列型でなければなりませんが、Cat に解決されます」および「Cat から Dog に変換できません」)。私がいる場所が午前 5 時だからかもしれませんが、なぜこれがうまくいかないのかわかりません。コピーと猫は同類じゃないの?
独自の clone() メソッドでオーバーライドしようとすると、同じエラーが発生します。以前に clone() を使用したことがない (またはそのことについて見たことがない) ので、自分で考え出す前に、理解していないことを確認したいと思います。ただし、価値があるのは、以前に次のコメントアウトを行い、コンパイラーが return ステートメントでスローしたことです。
protected Cat clone() {
Dog[] copy = new Dog[100];
int count = 0;
(while (count < cat.length) {
copy[count] = (Dog) cat[count];
count++;
}
return copy;
}
同型不一致エラー。ヘッダーを「保護された Dog[] clone()」に変更すると、コンパイラ エラーは解消されましたが、明らかに、どこにも行きませんでした。
助けてくれてありがとう!