scala:使用F-Bound参数引用Trait

scala:使用F-Bound参数引用Trait,scala,parametric-polymorphism,Scala,Parametric Polymorphism,我正在设计一个F-Bound数据类型,并且有一个工作的伙伴对象。我想从trait本身引用这个同伴对象,但是我不能正确地得到类型 trait A[AA <: A[AA]] { self => val data: String } case class A1(data : String) extends A[A1] trait B[BB <: B[BB, AA], AA <: A[AA]] { self: BB => val content: AA

我正在设计一个F-Bound数据类型,并且有一个工作的伙伴对象。我想从trait本身引用这个同伴对象,但是我不能正确地得到类型

trait A[AA <: A[AA]] {
  self =>
  val data: String
}
case class A1(data : String) extends A[A1]

trait B[BB <: B[BB, AA], AA <: A[AA]] {
  self: BB =>
  val content: AA
  def companion: BComp[BB, AA]  // What is the correct type?
  def companion2: BComp2[BB, AA] // What is the correct type?
}
trait BComp[BB[X <: BB[X, AA], Y <: AA[Y]], AA[Y <: AA[Y]]]

trait BComp2[BB[X <: AA[X]], AA[X <: AA[X]]]

case class BInst[AA <: A[AA]](content: AA) extends B[BInst[AA], AA] {
  def companion = BInst
  def companion2 = BInst2
}

object BInst extends BComp[B, A]
object BInst2 extends BComp2[BInst, A]
trait A[AA
val数据:字符串
}
案例类A1(数据:字符串)扩展了[A1]

特征B[BB对
companion
类型的任何明确定义的障碍是
BComp
由两个参数化类型参数化-第一个与
B
兼容,第二个与
AA兼容[Y+是一个简洁而完整的不可编译的最小工作示例;)好的,对不起-如果您注释掉两个def
companion
companion2
,它会编译。不,我是说真的。没有讽刺。问题很好。但是在这种情况下,我们不运行代码,而是计算静态编译时间近似值使用类型系统的运行时行为。因此,代码与它应该的完全一样:它在类型检查阶段失败,而不是在运行时。我非常确定我对CBF的和构建器以及相关对象有一点了解:但是,我不能将所有的a和BB映射到CBF的和构建器。它是受Gene启发的声明ricCompanion太模糊了,所以我不明白你想达到什么目的。另一个评论:惯例是像
CC
这样的标识符代表某种集合。特别是,它总是
CC[\u]
,而不仅仅是
CC
。我在你的代码中看不到它。
trait B[BB <: B[BB, AA, X],
        AA[T <: AA[T]] <: A[T], 
        X <: AA[X]]  {
    self: BB =>
    val content: X
    def companion: BComp[B, AA]
}
trait BComp[BHere[BB <: BHere[BB, AAA, Z],
                  AAA[Y <: AAA[Y]],
                  Z <: AAA[Z]],
            AA[Y <: AA[Y]]]
case class BInst[X <: A[X]](content: X) extends B[BInst[X], A, X] {
    def companion: BComp[B, A] = BInst5
  }
object BInst extends BComp[B, A]
trait B[BB[TS <: AA[TS]] <: B[BB, AA, TS],
        AA[T <: AA[T]] <: A[T], 
        X <: AA[X]] {
    self: BB[X] =>
    val content: X
    def companion2: BComp[BB, AA]
  }

trait BComp[BHere[TS <: AA[TS]],
            AA[Y <: AA[Y]]]
case class BInst[X <: A[X]](content: X) extends B[BInst, A, X] {
  def companion2: BComp[BInst, A] = BInst5
}
object BInst extends BComp[BInst, A]