Scala 构造三层深F-界类型

Scala 构造三层深F-界类型,scala,parametric-polymorphism,self-type,Scala,Parametric Polymorphism,Self Type,我有三个F-Bound类型A,B和C,其中B由A参数化,C由B参数化(因此也由A参数化)。我可以实例化A和B,但当我尝试实例化C时,编译器无法推断类型。如果我显式地给它类型,一切都可以工作——但是这些类型丢失(这是因为类型擦除吗?) A[AA val数据:字符串 } 案例类AInst(数据:字符串)扩展了[AInst] B[BB那怎么样: ... //A,AInst,B,BInst without changes sealed trait C[CC <: C[CC, BB, AA], B

我有三个F-Bound类型
A
B
C
,其中
B
A
参数化,
C
B
参数化(因此也由
A
参数化)。我可以实例化
A
B
,但当我尝试实例化
C
时,编译器无法推断类型。如果我显式地给它类型,一切都可以工作——但是这些类型丢失(这是因为类型擦除吗?)

A[AA
val数据:字符串
}
案例类AInst(数据:字符串)扩展了[AInst]
B[BB那怎么样:

... //A,AInst,B,BInst without changes

sealed trait C[CC <: C[CC, BB, AA], BB <: B[BB, AA], AA <: A[AA]] {
  self: CC =>
  val content: B[BB, AA] //`B[BB, AA]` instead of `BB`
}

case class CInst[BB <: B[BB, AA], AA <: A[AA]](content: B[BB,AA]) extends C[CInst[BB, AA], BB, AA]

它以前在编译器看来是不起作用的
BB
as
BInst[AA太好了,谢谢!我太接近了…类型定义变得有点笨拙,我想知道这是否也是一种代码味道。这取决于您如何看待它们:)我将它们视为编译时
def
s。但是编译类型推断可能不太清楚,实际上它非常取决于您的域逻辑,您可能真的不需要emI在此举了一个例子:
... //A,AInst,B,BInst without changes

sealed trait C[CC <: C[CC, BB, AA], BB <: B[BB, AA], AA <: A[AA]] {
  self: CC =>
  val content: B[BB, AA] //`B[BB, AA]` instead of `BB`
}

case class CInst[BB <: B[BB, AA], AA <: A[AA]](content: B[BB,AA]) extends C[CInst[BB, AA], BB, AA]
scala> val a1 = new AInst("A1")
a1: AInst = AInst(A1)

scala> val b1 = BInst(a1)
b1: BInst[AInst] = BInst(AInst(A1))

scala> val c1 = CInst(b1)
c1: CInst[BInst[AInst],AInst] = CInst(BInst(AInst(A1)))