Спецификация 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
(sans javadoc) просто
package java.lang;
public interface Cloneable {
}
Это означает, что Cloneable#clone()
не существует (и попытка скомпилировать приведенный выше пример метода приводит к ошибке времени компиляции, говорящей что-то вроде "cannot find symbol: method clone()
"). Не должен ли исходный код Cloneable
содержать что-либо с эффектом public Cloneable clone();
?
Почему нельзя допустить, чтобы класс, реализующий Cloneable
, имел метод public Cloneable clone()
?