Я читал, когда выполнял глубокую копию массива правильно, однако я был смущен тем, как реализуется #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 сделала это так? Я уверен, что у них есть законные причины, но я не могу понять это.
