Вот проблема, я думаю:
CircularlyLinkedList<E> other = (CircularlyLinkedList<E>) super.clone();
Теперь вы не сказали нам, что такое суперкласс CircularlyLinkedList
, но есть доказательства:
- Он не реализует интерфейс маркера
Cloneable
. - Он не переопределяет метод
clone
, который он наследует от Object
.
С этой комбинацией super.clone()
бросит CloneNotSupportedException
.Это объясняется в javadoc .
Реальная проблема заключается в том, почему ypou вызывает super.clone()
?
Если вы делаете это, потому что суперкласс имеетсостояние, которое необходимо скопировать в клоне, который вы создаете, тогда он (суперкласс) должен обеспечить некоторый способ клонирования;т. е. для этого нужно выполнить одно из вышеперечисленных ... или предоставить «конструктор копирования» или аналогичный.
Если вы делаете это только для того, чтобы заставить печатать работать , то вам, вероятно, следуетсделайте что-то вроде этого:
CircularlyLinkedList<E> other = new CircularlyLinkedList<>();
, где конструктор (который может private
при необходимости) создает экземпляр, который можно начинать заполнять. Обратите внимание, что это безопасно для типов.
Я отмечаю этот комментарий:
// always use inherited Object.clone() to create the initial copy
Если он предназначен для значения всегда для этого класса , то просто исправьте его так, чтобы он соответствовал тому, что вы на самом деле делаете.Помните, что вы можете это сделать только в том случае, если суперкласс является клонируемым ... которого в настоящее время нет!
Если он предназначен для записи того, что это «лучшая практика» (или что-то подобное; см. this) делать это во всех случаях, это просто неправильно:
- Как я объяснил, вы не можете сделать это во всех случаях.
- Хотя есть аргументы, что может быть нежелательно использовать другой метод для дублирования состояния суперкласса, подкласс имеет право делать предположения о своем суперклассе в ОО-дизайне.
- И, кроме того, позвонив
super.clone()
, вы делаете предположение ... что clone()
будет работать!