双 F 绑定多态类型中的更新函数

Update function in double F-Bound Polymorphic types

我希望能够在参数化的 F-Bounded 特征中提供更新时复制函数,其中 B 更新的值也是 F-Bounded。性状如下:

sealed trait A[AA <: A[AA]] {
  self: AA =>
  val data: String
}

sealed trait B[BB <: B[BB, AA], AA <: A[AA]] {
  self: BB =>
  val content: AA
}

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

在特征 B 中,我想提供一个带有签名的函数

def update[NewA <: AA](newA: NewA) : BB[BB, NewA]

所以案例 class 只是实现

def update[NewA <: AA](newA: NewA) = copy(content = newA)

但这目前无法编译。 Bupdate 的正确类型是什么?

编辑

一个应该有效(但目前无效)的例子:

  class A2Inst extends A[A2Inst] { val data: String = "A2Inst" }
  class A2Inst2 extends A2Inst {override val data: String = "A2INst2" }
  val a1 = new A2Inst
  val a2 = new A2Inst2
  val b = BInst(a1)
  b.update(a2)

BB 不采用类型参数,只需删除它们并更正输入和 return 类型:

sealed trait A[AA <: A[AA]] {
  self: AA =>
  val data: String
}

sealed trait B[BB <: B[BB, AA], AA <: A[AA]] {
  self: BB =>
  def update[NewA <:A[NewA]](newA: NewA) : B[_, NewA]
  val content: AA
}

case class BInst[BB <: B[BB,AA], AA <: A[AA]](content: AA) extends 
     B[BInst[BB, AA], AA] {
  def update[NewA <: A[NewA]](newA: NewA) = copy(content = newA)
}
defined trait A
defined trait B
defined class BInst

NewA <:A[NewA] 应作为输入传递以符合 AA <: A[AA]。 return 与新 NewA 相同 BB 是不可能的,因此您的方法将 return 其他 BB.

更新你的 edit1:A2Inst2 不是 F 界的,所以你甚至不能 BInst(a1),所以你应该:

class A2InstBase[T <: A2InstBase[T]] extends A[T] {val data = "a2Inst"}
class A2Inst extends A2InstBase[A2Inst]
class A2Inst2 extends A2InstBase[A2Inst2]{override val data = "a2Inst2"}