Я читал, когда выполнял глубокую копию массива правильно, однако я был смущен тем, как реализуется #clone()
. Он является членом класса java.lang.Object
, и все же, если вы читаете javadocs:
Во-первых, если класс этого объекта не реализует интерфейс Cloneable, генерируется исключение CloneNotSupportedException.
Так зачем определять метод clone
там, в первую очередь? Конечно, если метод можно использовать только при наличии интерфейса, вы должны поместить этот метод в интерфейс. Сам интерфейс Cloneable
пуст; это просто интерфейс маркера, используемый Java, чтобы гарантировать, что использование метода clone
является законным.
Выполнение этого способа также устраняет возможность использования дженериков для обеспечения безопасности типов:
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 сделала это так? Я уверен, что у них есть законные причины, но я не могу понять это.