我在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]
}
}
}
然而它抛出:那里出了什么问题?
答案 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()受到保护,即只能从子类中调用。