无法在T Access中访问类Object中的Scala方法clone,因为不允许使用受保护的方法clone

时间:2013-04-07 09:00:22

标签: scala clone

我在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中的方法clone  不允许访问受保护的方法克隆,因为  前缀类型T不符合  在物品测试仪中进行访问的特性

那里出了什么问题?

2 个答案:

答案 0 :(得分:2)

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

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

以便用户代码可能如下:

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

object Roll extends App with Grand[Person] {
...
}

答案 1 :(得分:1)

clone()来自java.lang.Object,而不是来自java.lang.Cloneable。 Cloneable只是一个标记界面。

你正在尝试的东西可能不起作用,因为实现Cloneable不会强制实现者用公共覆盖受保护的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()受到保护,即只能从子类中调用。