问题不是关于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 集合并在这里找到了提示:定义TestLiketrait,处理类型限制,以及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是Cloneablevia 的后代Store。但是带有类型参数的StorefinalizeCloneable接口Store及其所有后代都缺乏适当的clone()方法限制