给定一个超类或特征,并假设一个开放的层次结构,我如何强制所有扩展类实现一个特定的类型类?
例如,假设类型类Default
trait Default[T] { def default: T }
和一些特质Super
:
trait Super { }
我想强制执行以下(本身)不允许:
class A(val i: Int) extends Super
......而以下是:
class B(val i: Int) extends Super
implicit val bHasDef = new Default[B] { def default = B(42) }
假设以上是可能的,那么我可以从Super
中的方法访问子类型的类型类证据吗?即,像:
trait Super {
def magic: Default[this.type] = ???
}
答案 0 :(得分:0)
我几乎认为你不能强制执行,至少以一种简单的方式,也许它可以用更复杂的东西来塑造它。
我要做的是对超级特质添加一些修改,并使其自我引用Default
trait Default[T] { def default: T }
trait Super[T] {
self: Default[T] =>
}
class B(val i: Int) extends Super[Int] with Default[Int] {
override def default: Int = ???
}
class A(val i: Int) extends Super[Int] // doesn't compile, needs a Default
这也应该解决你问题的第二部分,缺点是现在一个特征被捆绑到另一个特征。