我有一个 F-Bound 类型:
sealed trait A[AA <: A[AA]] {
self: AA =>
}
还有第二种 F-Bound 类型,由第一种类型参数化。
sealed trait B[BB <: B[BB, AA], AA <: A[AA]] {
self: BB =>
val content: AA
}
我可以愉快地编写使用这些类型的案例类:
case class BInst[BB <: BInst[BB, AA], AA <: A[AA]](content: AA)
extends B[BInst[BB, AA], AA]
现在我想为案例类创建一个伴生对象,我可以通过特征 B 引用它,例如:
sealed trait A[AA <: A[AA]] { self: AA => }
sealed trait B[BB <: B[BB, AA], AA <: A[AA]] {
self: BB =>
val content: AA
def companion: Companion[BB]
}
case class BInst[BB <: BInst[BB, AA], AA <: A[AA]](content: AA)
extends B[BInst[BB, AA], AA] {
def companion: Companion[BInst[BB, AA]] = BInst
}
sealed trait Companion[+BB <: B[_, _]]
object BInst extends Companion[BInst]
但这无法编译,因为伴随参数化(最后一行)中的 BInst 需要类型参数。相似地
sealed trait Companion[BB[X, Y] <: B[X, Y]]
失败。伴生对象的正确类型是什么?