考虑这个片段定义模拟状态的特征,用户希望在某些派生类型中实现该特征。在特征上,一组实用程序方法应该能够提供具有实现类型的结果,类似于Scala库集合执行此操作的方式。为了实现这一点,我认为我需要使用实现类型来参数化特征,如下所示:
trait State[+This <: State[This]] {
def update : This // result has type of State's implementor
}
现在我想定义一个多步更新方法,如下所示:
def update(steps: Int) : This
当我尝试天真的方法时:
def update(steps: Int) : This =
(this /: (0 until steps))( (s,n) => s.update )
编译器抱怨类型不匹配:
error: type mismatch;
found: State[This]
required: This
这是有道理的,因为在州内看到的this
具有类型State [This]。
要获得编译代码,似乎我必须进行显式转换:
def update(steps: Int) : This =
(this.asInstanceOf[This] /: (0 until steps))( (s,n) => s.update )
有没有办法避免这种明确的演员,或者更普遍地以更好的方式达到预期的结果?谢谢。
答案 0 :(得分:5)
您需要添加自我类型注释,以确保State
为This
:
trait State[+This <: State[This]] { this: This =>
def update: This // result has type of State's implementor
}
在没有折叠的情况下重新定义update(Int)
方法的一种可能方法是:
def update(steps: Int): This = Iterator.iterate(this)(_.update).drop(steps).next