【发布时间】:2015-04-20 14:22:04
【问题描述】:
我正在设计一个 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
【问题讨论】:
-
+ 一个简洁完整的不可编译最小工作示例;)
-
好的,抱歉 - 如果您注释掉
companion和companion2两个定义,它将编译。 -
不,我说的是真的。没有讽刺。这个问题是好。但在这种情况下,我们不是运行代码,而是使用类型系统计算运行时行为的静态编译时间近似。因此,代码完全符合它应该的样子:它在类型检查阶段失败,而不是在运行时失败。
-
我很确定我对 CBF 和 Builders 和 Companion 对象有所了解:stackoverflow.com/questions/23432339/… 但是,我无法将所有 A 和 BB 映射到 cbf 和构建器。受 GenericCompanion 启发的说法太含糊了,恕我直言,所以我不明白你想要达到什么目的。
-
另一条评论:约定是像
CC这样的标识符代表某种集合。特别是,它总是CC[_],而不仅仅是CC。我在你的代码中看不到它。
标签: scala parametric-polymorphism