在 Scala 中,AnyRef.clone
执行浅拷贝还是深拷贝?
问问题
6558 次
1 回答
21
简短的回答:浅。
不那么简短的回答:除非它被覆盖,否则 AnyRef.clone() 使用 Java 的 Object.clone() 作为其实现。
Object.clone() 上的 Javadoc:
类 Object 的方法 clone 执行特定的克隆操作。首先,如果该对象的类没有实现接口 Cloneable,则抛出 CloneNotSupportedException。请注意,所有数组都被认为实现了接口 Cloneable。否则,此方法会创建此对象的类的新实例,并使用此对象的相应字段的内容来初始化其所有字段,就像通过赋值一样;字段的内容本身不会被克隆。因此,此方法执行此对象的“浅拷贝”,而不是“深拷贝”操作。
请注意:
- AnyRef.clone() 与 Java 中的对应物一样,具有“受保护”访问级别,因此不能从任何地方调用它。
- 您需要实现 Cloneable 才能使 clone() 工作。
长答案:阅读Effective Java,第 2 版,第 11 项:明智地覆盖克隆
摘要:不要使用它。有更好的选择。
于 2009-08-12T17:08:34.187 回答