シミュレーションの状態の特性を定義するこのスニペットについて考えてみます。これは、ユーザーが派生型で実装することが期待されています。特性上、ユーティリティメソッドのコレクションは、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内で見られるように、State[This]タイプを持っているので意味があります。コードをコンパイルするには、明示的なキャストを行う必要があるようです。
def update(steps: Int) : This =
(this.asInstanceOf[This] /: (0 until steps))( (s,n) => s.update )
この明示的なキャストを回避する方法、またはより一般的にはより良い方法で意図した結果を達成する方法はありますか?ありがとう。