Scalawags#2 の録画を少し見ていて気がついたのですが、型消去に関するこの部分があり、Dick Wall はリフレクションが最終的に足を噛むことになると指摘しています。
そこで、私はかなり頻繁に行っていることについて考えていました (Scala コレクションの実装も見ました)。システムを型パラメーターとして受け取るシリアライザーを備えたシステムがあるとします。
trait Sys[S <: Sys[S]] { type Tx }
trait FooSys extends Sys[FooSys]
trait Serializer[S <: Sys[S], A] {
def read(implicit tx: S#Tx): A
}
現在、値パラメーターなしA
でシリアライザーを構築できる型が多数あるため、基本的にシステム型パラメーターは「中空」です。また、私の例ではシリアライザーが頻繁に呼び出されるため、インスタンス化を節約しています。
object Test {
def serializer[S <: Sys[S]] : Serializer[S, Test[S]] =
anySer.asInstanceOf[Ser[S]]
private val anySer = new Ser[FooSys]
private final class Ser[S <: Sys[S]] extends Serializer[S, Test[S]] {
def read(implicit tx: S#Tx) = new Test[S] {} // (shortened for the example)
}
}
trait Test[S <: Sys[S]]
私はこれが正しいことを知っていますが、もちろん、asInstanceOf
悪臭があります. このアプローチに対する提案はありますか?2つのことを追加させてください
- 型パラメーターを trait のコンストラクターからメソッドに移動すること
Serializer
はread
オプションではありません ( でパラメーター化された値引数を必要とする特定のシリアライザーがありますS
) - の型コンストラクタ パラメータに分散を追加すること
Serializer
はオプションではありません