1. ホーム
  2. java

[解決済み] clone() のアクセスは保護されています - public Object clone() を作成しました。

2022-02-09 19:43:17

質問

オブジェクトを作成し、そのオブジェクトをクローンして、その2つを比較するコードを書いています。

問題のオブジェクトである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();


    }
}

mainメソッドの最終行でエラーが発生します。

clone() has protected access in Object

Octagaonのcloneメソッドの名前をclonemeに変えてみましたが、そうするとエラーが発生します。

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

この問題は、Octagonが別のオブジェクトを拡張しているからではないかという気がするのですが、どうでしょう?

私は本当に解決策を見つけることができず、ここで他のすべてのclone()の投稿を読んで、かなりの時間を費やしました。

編集部:cloneを使うことが必須です。一般的なコンセンサスはcloneがダメだということですが、私はそう思っています。

解決方法は?

交換する

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

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

で、呼び出されたクローンメソッドが自分のクラスのものであるようにします。