配列のディープコピーを正しく実行することについて読んでいましたが、#clone()
実装方法について混乱していました。これはjava.lang.Object
クラスのメンバーですが、javadocs を読むと:
まず、このオブジェクトのクラスがインターフェース Cloneable を実装していない場合、CloneNotSupportedException がスローされます。
clone
では、そもそもなぜそこでメソッドを定義するのでしょうか? 確かに、インターフェイスが存在する場合にのみメソッドを使用できる場合は、メソッドをインターフェイスに配置します。Cloneable
インターフェイス自体は空です。clone
これは、メソッドの使用が合法であることを確認するために Java によって使用される単なるマーカー インターフェイスです。
このようにすると、型の安全性を確保するためにジェネリックを使用する機能も削除されます。
class Foo implements Cloneable { // Valid.
@Override
public Object clone() throws CloneNotSupportedException {
// ...
}
}
class TypeSafeFoo implements Cloneable<TypeSafeFoo> { // Not valid.
@Override
public TypeSafeFoo clone() throws CloneNotSupportedException {
// ...
}
}
なぜJavaはこのようにしたのですか?正当な理由があると確信していますが、それを理解できないようです。