Clone() имеет защищенный доступ к объекту public clone()

Я пишу код для создания объекта, клонирования объекта, а затем сравнения двух.

Объект, о котором идет речь, Octagon, является расширением объекта GeometricObject

public class Octagon extends GeometricObject implements Comparable<Octagon>, Cloneable {
private double side;

public Octagon (double side){
    this.side = side;
}

public Object clone() throws CloneNotSupportedException {
    Octagon octClone = (Octagon)super.clone();
    return octClone;
}

В файле с именем Octagon.java

В другом, TestOctagon.java, является моим основным методом:

public class TestOctagon {
    public static void main(String[] args) {
        GeometricObject test = new Octagon(5); //create an Octagon with a side of 5
        System.out.println("Area is: "+test.getArea());
        System.out.println("Perimeter is: "+test.getPerimeter());

        Octagon copy = (Octagon)test.clone();


    }
}

Ошибки попадают в последнюю строку основного метода.

clone() has protected access in Object

Я пробовал переименовать метод clone в Octagaon, скажем cloneme, но потом я получаю сообщение об ошибке:

cannot find symbol
symbol: method cloneme()
location: variable test of type GeometricObject

Мне кажется, проблема в том, что Octagon расширяет еще один объект, может быть?

Я действительно не могу найти решение, и я потратил хороший час на чтение всех других сообщений clone() здесь.

Изменить: мне нужно использовать клон. Я знаю, что общий консенсус заключается в том, что клон срывается.

Ответ 1

Заменить

Octagon copy = (Octagon)test.clone();

с

Octagon copy = (Octagon)((Octagon)test).clone();

чтобы метод вызываемого клона был одним из ваших классов.

Ответ 2

Вы можете написать экземпляр-конструктор:

public Octagon( Octagon right ){
    this.side = right.side;
}

И используйте его из метода clone: ​​

public Object clone() throws CloneNotSupportedException {
    return new Octagon( this );
}