子类错误:永远不会在 try 主体中抛出 CloneNotSupportedException

我现在正在做一个关于继承和深度克隆的报告。


交接是关于使用继承和深度克隆的思想,使用在画布上绘制形状的程序重写给我们的代码。


现在我已经clone()为超类point和我的子类实现了这个方法group,但是当它编译时我总是在我的子类中得到一个CloneNotSupportedExceptionwith clone(),我真的不明白为什么。


这是我的超类的代码:


public abstract class Point implements Cloneable

{

public Point clone() 

    {

        try {

             Point copy = (Point)super.clone();

             copy.imgGroup = (ArrayList<Point>)imgGroup.clone();

             return copy;

        }

        catch (CloneNotSupportedException e) {

            throw new InternalError();

        }

     }

}

这是我的子类的代码:


public class Group extends Point implements Cloneable

{

public Group clone() 

    {

        try {

            Group copy = (Group)super.clone();

            copy.group = (ArrayList<Point>)group.clone();

            for (int i = 0; i < group.size(); i++) {

                copy.group.set(i,group.get(i).clone());

            }

            return copy;

        }

        catch (CloneNotSupportedException e) {

            throw new InternalError();

        }

    }

}

任务:


构造类Group。Figure可以将某个对象添加到多个不同的组中。您必须确定同一个Figure对象是否可以同时属于多个组。在本练习中,这不应该发生。所有Group对象都必须独占它们的 item 对象。不会发生多个组之间的对象共享。


因此,我们开始添加方法:


public Figure class clone ();

// (define it in the same style as on page 4 in the document below)

// this was what point clone() was in the class Point.

在此之后,有一些方法和Group克隆的实现说明。


因此,在此任务中,我应该Group使用各种方法以及 new来实现clone(),这就是我现在遇到的问题。


我希望你能帮助我指出正确的方向,只是想知道为什么会这样。谢谢!


慕姐8265434
浏览 140回答 1
1回答

烙印99

我总是在我的子类中使用 clone() 得到 CloneNotSupportedException我想你得到的是; Unreachable catch block for CloneNotSupportedException.那是因为您throws CloneNotSupportedException从超类签名中省略了。但是,在子类中,您希望super.clone()抛出已检查的CloneNotSupportedException. 将您的超类实现更改为;public abstract class Point implements Cloneable {&nbsp; &nbsp; public Point clone() throws CloneNotSupportedException {&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; Point copy = (Point) super.clone();&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; return copy;&nbsp; &nbsp; }}以便子类可以看到超类签名中抛出的异常。更新请遵循下面的评论以获得更好的清晰度。更新 2添加更多详细信息,因为用户删除了另一个答案(我上面的评论指的是)。你不能实例化一个抽象类——但你仍然可以clone()在其中拥有一个方法。但是抽象类应该在其克隆方法中返回的具体克隆实例是什么?当你说this或super.clone()在一个抽象类中时,它们在运行时都指的是同一个子类实例。这意味着浅拷贝 ( Point copy = (Point) super.clone();) 是Group您案例中的一个实例。您可以添加System.out.println(super.clone().getClass())抽象超类的clone方法来见证这一点。因此,您可以在超级抽象类中深度克隆可继承属性 - 并且 - 仅在子类的 clone() 方法中深度克隆子类的属性。如果您定义了多个子类,这样您就可以避免在所有子类中深度克隆超类属性。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java