问题不是关于AnyRef.clone()
,而是关于具有相似语义的案例。
我想为可能创建自身副本的类定义一个接口:
trait Cloneable {
def clone() : this.type
}
class Test(val store : Int) extends Cloneable {
def clone() = new Test(store)
}
路径依赖this.type
不起作用,因为this.type
类Test
类型和扩展Test
. 然后后代应该覆盖克隆方法以匹配它自己的类型。
我应该如何定义 Cloneable 特征的类型要求?
我查看了 scala 集合并在这里找到了提示:定义TestLike
trait,处理类型限制,以及Test
体现相应 trait 的类。
如果可能的话,我想避免不必要的笨拙
按照建议尝试自我重复模式:
trait Cloneable[A <: Cloneable[A]] {
def clone() : A
}
class Store[A <: Cloneable[A]](val store : Int) extends Cloneable[A] {
override def clone() : A = new Store[A](store)
}
失败并出现错误:
Cloneable.scala:6: error: type mismatch;
found : Store[A]
required: A
override def clone() : A = new Store[A](store)
重复模板中的另一个问题:过早完成
class Store(val store : Int) extends Cloneable[Store] {
override def clone() = new Store(store)
}
class SubStore(store : Int, val stash : Double) extends Store(store)
val ss1 = new SubStore(1, 0.5)
val ss2 = ss1.clone()
assert(ss2.isInstanceOf[SubStore])
问题SubStore
在于类型系统忽略clone()
了类中不存在的方法,SubStore
尽管SubStore
是Cloneable
via 的后代Store
。但是带有类型参数的Store
finalizeCloneable
接口Store
及其所有后代都缺乏适当的clone()
方法限制