2

我在 Scala 中克隆时遇到了麻烦。这是否可以克隆任意类型 T 的对象?像这样的东西:

import collection.immutable.Stack

object Tester extends App {
  trait Grand[T <: Cloneable] {
    val stack = Stack[T]()
    val h: T

    def snapshot() {
      stack push h.clone().asInstanceOf[T]
    }
  }
}

但是它抛出:
scala:无法在 T 中访问类 Object 中的
方法克隆 不允许访问受保护的方法克隆,因为前缀类型 T 不符合进行访问的对象 Tester 中的特征 Grand

那里出了什么问题?

4

2 回答 2

2

我被告知了这个问题。在这种情况下,最好的方法是使用结构类型:

trait Grand[T <: {def cloneObject: T}]

以便用户代码可能如下:

case class Person(name: String) {
  def cloneObject = copy()
}

object Roll extends App with Grand[Person] {
...
}
于 2013-04-11T07:55:01.453 回答
1

clone() 来自 java.lang.Object 而不是来自 java.lang.Cloneable。Cloneable 只是一个标记接口。

您正在尝试的可能不起作用,因为实现 Cloneable 不会强制实现者用公共的 Object.clone() 覆盖受保护的 Object.clone() 。

请参阅 http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#clone()http://docs.oracle.com/javase/7/docs/api/java /lang/Cloneable.html

结论:不,不可能克隆任意类型 T1 的对象。但是,您可以克隆任何 T2 类型的对象,其中 T2 由具有公共覆盖 clone() 的类型绑定。您的示例失败,因为 Object.clone() 受到保护,即只能从子类中调用。

于 2013-04-07T10:04:12.350 回答