私は 3 つの F-Bound タイプA
、B
&C
を持ってB
います。とをインスタンス化できますが、 をインスタンス化しようとすると、コンパイラは型を推測できません。明示的に型を指定すると、すべてが機能しますが、これらの型が失われるのはかなりばかげているようです (これは型の消去によるものですか?)。A
C
B
A
A
B
C
sealed trait A[AA <: A[AA]] {
self =>
val data: String
}
case class AInst(data: String) extends A[AInst]
sealed trait B[BB <: B[BB, AA], AA <: A[AA]] {
self: BB =>
val content: AA
}
case class BInst[AA <: A[AA]](content: AA) extends B[BInst[AA], AA]
sealed trait C[CC <: C[CC, BB, AA], BB <: B[BB, AA], AA <: A[AA]] {
self: CC =>
val content: BB
}
case class CInst[BB <: B[BB, AA], AA <: A[AA]](content: BB)
extends C[CInst[BB, AA], BB, AA]
val a1 = new AInst("A1")
val b1 = BInst(a1)
val c1 = CInst[BInst[AInst],AInst](b1)
具体的に型を指定する必要がない回避策はありますCInst
か?
現在、型のパラメーター化を使用して F-Bounds を実装していますが、抽象型メンバーに切り替えるとこの問題は解決しますか? その時、クラスはどのようになりますか?