Спецификация 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()
?