我有下面的代码,我希望class My重写了clone()函数,它应该可以工作.但打super.clone()似乎抛出了异常.

class My {
  @Override
  public My clone() {
    My ret = null;
    try {
      ret = (My)super.clone();
    } catch (CloneNotSupportedException e) {
      System.out.println("Should not reach here");
      e.printStackTrace();
    }
    return ret;
  }
}
public class UseClone implements Cloneable {
  public static void main(String[] args) {
    My nc = new My();
    My n2 = (My) nc.clone();
  }
}

它打印:

Should not reach here
java.lang.CloneNotSupportedException: mygroup.My
        at java.lang.Object.clone(Native Method)
        at mygroup.My.clone(UseClone.java:9)
        at mygroup.UseClone.main(UseClone.java:20)
        at org.codehaus.mojo.exec.ExecJavaMojo$1.run(ExecJavaMojo.java:254)
        at java.lang.Thread.run(Thread.java:748)

那么,如何让它发挥作用呢?

推荐答案

您定义了一个类"My",它有一些问题.您还定义了

class My {
    @Override
    public My clone() {
        return super.clone();
    }
}

try 从上面编译My类会导致以下错误:

java: incompatible types: java.lang.Object cannot be converted to My

关于代码和错误的几点:

  • 您调用了一个方法super.clone(),其中该方法本身返回Object类型的对象
  • 该调用(到super.clone())之所以会这样做,是因为它解析为具有此签名的Object.clone():
  • 编译器告诉您,super.clone()的返回类型(同样,返回类型Object)与您在方法签名中定义的返回类型不兼容:

要修复代码,请执行以下操作:

  1. 修改My类以实现Cloneable接口,更改如下:

    class My {
    

    对此:

    class My implements Cloneable {
    
  2. 更改方法中的返回类型,使其返回Object而不是My:

    class My implements Cloneable {
        public Object clone() {
            return super.clone();
        }
    }
    
  3. clone()方法中添加throws子句,更改如下:

    public Object clone() {
    

    对此:

    public Object clone() throws CloneNotSupportedException {
    

最后,这里是My类的基本工作版本:

class My implements Cloneable {
    public Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

Java相关问答推荐

LocalTime解析截断时间的第二个值

Gmail Javi API批量处理太多请求

在Spring Boot中测试时出现SQL语法错误

Selenium Java:无法访问IFRAME内部的元素

具有额外列的Hibert多对多关系在添加关系时返回NonUniqueHealthExcellent

Annotation @ Memphier无法正常工作,并表示:class需要一个bean,但找到了2个bean:

OpenJDK、4K显示和文本质量

我的scala文件失败了Scala.g4 ANTLR语法

如何配置ActiveMQ Artemis以使用AMQP 1.0和其他协议与Java

我无法获取我的Java Spring应用程序的Logback跟踪日志(log)输出

Java:使用Class.cast()将对象转换为原始数组

为什么S的文档中说常量方法句柄不能在类的常量池中表示?

对字符串长度进行排序,但颠倒了顺序(最长字符串在前)

如何在JavaFX中处理多个按钮

与IntArray相比,ArrayList<;Int>;对于大量元素的性能极差

当构造函数创建一个新实例时,Java为什么需要&new";

如何使用MapStrCut转换双向链接

Java类型推断:为什么要编译它?

让标签占用JavaFX中HBox的所有可用空间

Eureka客户端无法使用用户/通行证注册到Eureka服务器