clone()方法受保护访问 - 将其公开为public Object clone()

27

我正在编写代码来创建一个对象,克隆这个对象,然后比较这两个对象。

所涉及的对象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

我尝试将Octagaon中的克隆方法重命名为cloneme,但是我遇到了以下错误:

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

我感觉问题可能是因为八边形扩展了另一个对象导致的,也许?

我真的找不到任何解决方案,我已经花了一个小时阅读这里所有关于clone()的帖子。

编辑:需要使用clone。我知道普遍意见是clone有问题。


1
你不能将受保护的方法覆盖为公共方法。在你的 Octagon 类中,将其定义为 protected Object clone() - Rob Watts
3个回答

20

替换

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

随着

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

这样调用的克隆方法就是你类的方法。


正是所需的。非常感谢。我需要使用类似的方式调用自定义的compareTo(Octagon o)函数,如((Octagon)test).compareTo(copy);。看起来很荒谬,我的教科书里居然没有提到这一点。 - Dirgon
克隆被广泛认为是设计不良,这就是为什么你在教科书中可能看不到它的原因。 - Denys Séguret
很不幸,文本中的任务要求使用克隆。但是这篇文章很有趣,谢谢。 - Dirgon
1
你好,请问为什么需要双重转换?我对此感到很困惑,谢谢! - Scaramouche
5
test变量的类型是Object,因此必须进行强制类型转换才能找到clone方法。然后clone的返回类型也是Object,这意味着它必须再次进行强制类型转换才能赋值给类型为Objectcopy变量。 - Denys Séguret

9

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

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

并从克隆方法中使用它:

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

0
我也遇到了同样的错误,并通过在类内创建一个公共函数来解决它。
public class Octagon { ....

    public Octagon copy() {
        try {
          return (Octagon) clone();
        } catch(Exception e) {
          return new Octagon();
        } 
    }
    
    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接