Вы реализовали интерфейс Cloneable на своем объекте?
Однако есть очень мало случаев, когда я бы использовал клон для копирования объекта. Одним из таких безопасных примеров является array.clone (). Я бы предпочел использовать идиому конструктора копирования или вручную копировать / присваивать значения.
В фоновой проблеме есть пункт № 11 в Effective Java (2-е издание). Клонируемый интерфейс - это особый вид интерфейса, поскольку он изменяет поведение класса Object
в отношении клонирования. По сути, это функция, включающая интерфейс class в Java.
Редактировать: Исходя из вашего примера, вам может понадобиться обернуть вызов clone () в try-catch класса CloneNotSupportedException в общем случае.
Edit2: Перефразировал мой ответ
Edit3: Переопределили ли вы клон () в контексте public
? В приведенном вами примере вы пытаетесь клонировать объект, который находится в пакете java.lang - вряд ли это пакет, в котором находится ваш код.
Edit4: Я думаю, что ответ уже в других сообщениях, просто хотел поразмыслить над основной проблемой.
Редактировать5: Попробуйте это:
public Object clone1() throws CloneNotSupportedException {
return super.clone();
}
Edit6 Затем назовите ваш метод public abstract Object copy()
, например, и в реализации используйте super.clone () - чтобы избежать путаницы.
Edit7 Я сделал некоторые затмения и предложил следующее решение:
public class Cloner {
public static abstract class Person {
protected abstract Object clone1() throws CloneNotSupportedException;
public Object copy() throws CloneNotSupportedException {
return clone1();
}
}
public static class Employee extends Person implements Cloneable {
@Override
protected Object clone1() throws CloneNotSupportedException {
return super.clone();
}
}
public static void main(String[] args) throws Exception {
new Employee().copy();
}
}
Но в принципе это та же концепция, что и переименование вашего абстрактного метода во что-то другое, чем clone ().
Edit8: Исправлен мой пример, теперь он работает без исключения.
(Но фактический кредит поступает на Габор Харгитай на super.clone()
)