gpt4 book ai didi

java - 子类错误: CloneNotSupportedException never being thrown in the try body

转载 作者:行者123 更新时间:2023-12-02 10:40:44 25 4
gpt4 key购买 nike

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

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

现在我已经为父类(super class)point和子类group实现了clone()方法,但我总是得到一个CloneNotSupportedException 与我的子类中的 clone() 编译时,我不太明白为什么。

这是我的父类(super class)的代码:

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();
}
}
}

任务:

构造类。某个 Figure 对象可以添加到多个不同的组中。您必须确定同一个 Figure 对象是否可以同时属于多个组。在本练习中,这种情况不应该发生。所有Group 对象必须独占其项目对象。多个组之间不得共享对象。

因此,我们首先添加方法:

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克隆的实现说明。

所以在这个任务中,我应该使用各种方法以及新的clone()来实现Group,这就是我现在遇到的问题.

我希望你能帮助我指明正确的方向,只是想知道为什么会发生这种情况。谢谢!

最佳答案

I always get a CloneNotSupportedException with the clone() in my subclass

我想你得到的是; 无法访问 CloneNotSupportedException 的 catch block 。

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

public abstract class Point implements Cloneable {
public Point clone() throws CloneNotSupportedException {
Point copy = (Point) super.clone();
return copy;
}
}

这样父类(super class)签名中抛出的异常对于子类是可见的。

更新

请关注this comment为了更清楚起见,请参见下文。

更新2

添加更多详细信息,因为其他答案已被用户删除(我上面的评论所指的地方)。

您无法实例化抽象类 - 但您仍然可以在其中使用 clone() 方法。但是抽象类应该在其克隆方法中返回的具体克隆实例是什么?当您在抽象类中使用 thissuper.clone() 时,这两者在运行时都引用同一个子类实例。这意味着浅复制 (Point copy = (Point) super.clone();) 是您的情况下的 Group 实例。您可以在抽象父类(super class)的 clone 方法中添加 System.out.println(super.clone().getClass()) 来见证这一点。

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

关于java - 子类错误: CloneNotSupportedException never being thrown in the try body,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52936164/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com