clone
まず、それ自体が壊れていること、およびコピー コンストラクターのようなものは、コントラクトが非常に弱いことを考えると、Sheep(Sheep cloneMe)
よりもはるかにエレガントなイディオムであることに注意してください。この本を読んでいるので、おそらくすでにこれを知っているでしょうが、ここに入れる価値があります。clone
Cloneable
とにかく、質問に答えるには:
Object.clone()
呼び出されたオブジェクトと同じタイプのオブジェクトを作成します。このため、Object
返す予定の結果を取得するために「カスケード」することを強くお勧めします。誰かがこの規則に従わないと決めた場合、規則を破ったクラスの型のオブジェクトになってしまい、多くの問題が発生します。
説明するために、私はそのようなクラスを持っています
class Sheep implements Cloneable {
Sheep(String name)...
public Object clone() {
return new Sheep(this.name); // bad, doesn't cascade up to Object
}
}
class WoolySheep extends Sheep {
public Object clone() {
return super.clone();
}
}
突然、私がそうするなら
WoolySheep dolly = new WoolySheep("Dolly");
WoolySheep clone = (WoolySheep)(dolly.clone()); // error
dolly.clone()
返されるのはSheep
ではなく であるため、例外が発生しますWoolySheep
。