14

在 Scala 中,AnyRef.clone执行浅拷贝还是深拷贝?

4

1 回答 1

21

简短的回答:浅。

不那么简短的回答:除非它被覆盖,否则 AnyRef.clone() 使用 Java 的 Object.clone() 作为其实现。

Object.clone() 上的 Javadoc:

类 Object 的方法 clone 执行特定的克隆操作。首先,如果该对象的类没有实现接口 Cloneable,则抛出 CloneNotSupportedException。请注意,所有数组都被认为实现了接口 Cloneable。否则,此方法会创建此对象的类的新实例,并使用此对象的相应字段的内容来初始化其所有字段,就像通过赋值一样;字段的内容本身不会被克隆。因此,此方法执行此对象的“浅拷贝”,而不是“深拷贝”操作。

请注意:

  1. AnyRef.clone() 与 Java 中的对应物一样,具有“受保护”访问级别,因此不能从任何地方调用它。
  2. 您需要实现 Cloneable 才能使 clone() 工作。

长答案:阅读Effective Java,第 2 版,第 11 项:明智地覆盖克隆

摘要:不要使用它。有更好的选择。

于 2009-08-12T17:08:34.187 回答