【发布时间】:2015-04-17 13:11:43
【问题描述】:
我有三个 F-Bound 类型A、B 和C,其中B 由A 参数化,C 由B 参数化(因此也由@987654329 参数化) @)。我可以实例化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,但是切换到抽象类型成员会解决这个问题吗?那时的班级会是什么样子?
【问题讨论】:
标签: scala parametric-polymorphism self-type