23

オブジェクトを作成し、オブジェクトを複製してから、2 つを比較するコードを書いています。

問題のオブジェクトである Octagon は、オブジェクト GeometryObject の拡張です。

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 という名前のファイル内

もう 1 つの 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

問題は、オクタゴンが別のオブジェクトを拡張しているためだと思いますか?

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

編集:クローンを使用する必要があります。クローンが壊れているという一般的なコンセンサスがあることは承知しています。

4

2 に答える 2

18

交換

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

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

呼び出された clone メソッドがクラスのメソッドになるようにします。

于 2013-04-16T18:58:02.647 に答える
9

コピーコンストラクターを書くことができます:

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

clone メソッドから使​​用します。

public Object clone() throws CloneNotSupportedException {
    return new Octagon( this );
}
于 2013-04-16T18:58:09.977 に答える