我试图找出如何.clone
我自己的对象,在斯卡拉。
这是一个模拟所以可变状态是必须的,并从出现的克隆全部的需要。 我会向前推进仿真时间之前克隆整个国家结构。
这是我目前的尝试:
abstract trait Cloneable[A] {
// Seems we cannot declare the prototype of a copy constructor
//protected def this(o: A) // to be defined by the class itself
def myClone= new A(this)
}
class S(var x: String) extends Cloneable[S] {
def this(o:S)= this(o.x) // for 'Cloneable'
def toString= x
}
object TestX {
val s1= new S("say, aaa")
println( s1.myClone )
}
一个。 为什么上面没有编译。 得到:
error: class type required but A found
def myClone= new A(this)
^
湾 是否有申报拷贝构造函数的方式( def this(o:A)
的特征),因此使用性状类将被证明需要提供一个。
C。 难道有说任何好处abstract trait
?
最后,有没有更好的方式,标准溶液这一切?
我已经研究过Java的克隆。 似乎并不为这一点。 此外斯卡拉copy
不是-它只是为case类,他们不应该有可变的状态。
感谢您的帮助和任何意见。
性状不能定义构造函数(我不认为abstract
有一个特点任何影响)。
是否有它需要使用拷贝构造函数,而不是仅仅实现一个克隆方法的原因吗? 有可能走出不必申报[A]对类类型的,但我至少宣布自类型,这样编译器将确保该类型的类相匹配。
trait DeepCloneable[A] { self: A =>
def deepClone: A
}
class Egg(size: Int) extends DeepCloneable[Egg] {
def deepClone = new Egg(size)
}
object Main extends App {
val e = new Egg(3)
println(e)
println(e.deepClone)
}
http://ideone.com/CS9HTW
这将意味着一个类型类为基础的方法。 有了这个就可以也让现有的类可复制:
class Foo(var x: Int)
trait Copyable[A] {
def copy(a: A): A
}
implicit object FooCloneable extends Copyable[Foo] {
def copy(foo: Foo) = new Foo(foo.x)
}
implicit def any2Copyable[A: Copyable](a: A) = new {
def copy = implicitly[Copyable[A]].copy(a)
}
scala> val x = new Foo(2)
x: Foo = Foo@8d86328
scala> val y = x.copy
y: Foo = Foo@245e7588
scala> x eq y
res2: Boolean = false
一个。 当你定义喜欢的类型参数 A
它被编译阶段后删除 。
这意味着,编译器使用类型的参数来检查是否使用了正确的类型,但由此产生的字节码不保留的信息A
。
这也意味着,你不能用A
作为代码,但只能作为“类型引用”一个真正的类,因为在运行时,这个信息会丢失。
B&C。 性状不能被定义定义构造函数的参数或辅助建设者,他们也被定义抽象。
你可以做的是定义一个特征体能够顺利通过的具体实施实例称为
一种替代的解决方案是定义一个Cloneable
类型类 。 欲了解更多关于这一点,你可以找到很多关于这一主题的博客,但我有一个特定的一个没有建议。
scalaz有一个很大一部分建使用这种模式,也许你能在那里找到灵感:你可以看看订单 , 等于或展示来获得它的要点。