我正在设计一个 F-Bound 数据类型,并且有一个工作伴侣对象。我想从特征本身引用这个伴随对象,但我无法正确获取类型。
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]
一个可行的解决方案companion
就companion2
足够了,尽管关于如何构造这些类型签名的一般提示会很有用。
编辑
我想使用伴随对象来存储canBuildFrom
样式隐式以及构建器,但是由于内容类型A
具有上限,所有生成函数都需要知道这个边界,因此伴随对象特征的参数化。这个设计的灵感来自GenericCompanion.scala,当然,添加类型边界会使一切变得更加困难:P