Почему java.lang.Cloneable не переопределяет метод clone() в java.lang.Object?

Спецификация Java для java.lang.Интерфейс Cloneableопределяет себя как означающий, что любой объект, который расширяет его, также реализует метод clone(), который бездействует в java.lang.Object. В частности, в нем говорится, что:

Класс реализует интерфейс Cloneable, чтобы указать методу java.lang.Object#clone(), что этот метод может выполнять полевая копия экземпляров этого класса.

Для меня это означает, что каждый класс, расширяющий Cloneable, также имеет метод public Object clone(). Это позволяет легко предположить, что следующий метод является допустимым:

public static makeACloneFrom(Cloneable c)
{
  return c.clone();
}

однако это не так, поскольку весь исходный код Cloneable(без javadoc) просто

package java.lang;

public interface Cloneable {
}

Что означает что Cloneable#clone()не существует (и попытка скомпилировать приведенный выше пример метода выдает ошибку времени компиляции, говорящую что-то вроде «не может найти символ: метод clone()») . Разве исходный код Cloneableне должен содержать что-то похожее на public Cloneable clone();?

Почему нельзя предположить, что класс, реализующий Cloneable, имеет публичный метод Cloneable clone()?

6
задан JasonMArcher 14 July 2015 в 18:27
поделиться