双 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)
但这目前无法编译。 B
中 update
的正确类型是什么?
编辑
一个应该有效(但目前无效)的例子:
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"}
我希望能够在参数化的 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)
但这目前无法编译。 B
中 update
的正确类型是什么?
编辑
一个应该有效(但目前无效)的例子:
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"}