clone()具有受保护的访问权限 - 公共对象clone()

Dir*_*gon 18 java 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;
}
Run Code Online (Sandbox Code Playgroud)

在名为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();


    }
}
Run Code Online (Sandbox Code Playgroud)

错误出现在main方法的最后一行.

clone() has protected access in Object
Run Code Online (Sandbox Code Playgroud)

我已经尝试在Octagaon中重命名克隆方法,比如说克隆,但是后来我得到了错误:

cannot find symbol
symbol: method cloneme()
location: variable test of type GeometricObject
Run Code Online (Sandbox Code Playgroud)

我觉得问题是因为Octagon扩展了另一个对象,也许?

我真的找不到任何解决方案,我花了一个小时阅读所有其他clone()帖子.

编辑:我需要使用克隆.我知道普遍的共识是克隆被禁止了.

Den*_*ret 15

更换

Octagon copy = (Octagon)test.clone();
Run Code Online (Sandbox Code Playgroud)

Octagon copy = (Octagon)((Octagon)test).clone();
Run Code Online (Sandbox Code Playgroud)

这样被调用的克隆方法就是你的一个类.

  • @Scaramouche `test` 变量的类型是 `Object`。因此必须对其进行强制转换才能找到 `clone` 方法。那么返回的 `clone` 类型也是 `Object`,这意味着它必须再次转换才能分配给 `Object` 类型的 ̀copy` 变量。 (2认同)

Aub*_*bin 9

你可以写一个拷贝构造函数:

public Octagon( Octagon right ){
    this.side = right.side;
}
Run Code Online (Sandbox Code Playgroud)

并从克隆方法中使用它:

public Object clone() throws CloneNotSupportedException {
    return new Octagon( this );
}
Run Code Online (Sandbox Code Playgroud)