为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕姐8265434 2021-12-01 19:01:45
我现在正在做一个关于继承和深度克隆的报告。交接是关于使用继承和深度克隆的思想,使用在画布上绘制形状的程序重写给我们的代码。现在我已经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(),这就是我现在遇到的问题。我希望你能帮助我指出正确的方向,只是想知道为什么会这样。谢谢!
查看完整描述

1 回答

?
烙印99

TA贡献1829条经验 获得超13个赞

我总是在我的子类中使用 clone() 得到 CloneNotSupportedException


我想你得到的是; Unreachable catch block for CloneNotSupportedException.


那是因为您throws CloneNotSupportedException从超类签名中省略了。但是,在子类中,您希望super.clone()抛出已检查的CloneNotSupportedException. 将您的超类实现更改为;


public abstract class Point implements Cloneable {

    public Point clone() throws CloneNotSupportedException { 

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

        return copy;

    }

}

以便子类可以看到超类签名中抛出的异常。


更新


请遵循下面的评论以获得更好的清晰度。


更新 2


添加更多详细信息,因为用户删除了另一个答案(我上面的评论指的是)。


你不能实例化一个抽象类——但你仍然可以clone()在其中拥有一个方法。但是抽象类应该在其克隆方法中返回的具体克隆实例是什么?当你说this或super.clone()在一个抽象类中时,它们在运行时都指的是同一个子类实例。这意味着浅拷贝 ( Point copy = (Point) super.clone();) 是Group您案例中的一个实例。您可以添加System.out.println(super.clone().getClass())抽象超类的clone方法来见证这一点。


因此,您可以在超级抽象类中深度克隆可继承属性 - 并且 - 仅在子类的 clone() 方法中深度克隆子类的属性。如果您定义了多个子类,这样您就可以避免在所有子类中深度克隆超类属性。


查看完整回答
反对 回复 2021-12-01
  • 1 回答
  • 0 关注
  • 139 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信