强制所有子类实现给定的类型类

时间:2016-03-18 18:30:42

标签: scala

给定一个超类或特征,并假设一个开放的层次结构,我如何强制所有扩展类实现一个特定的类型类?

例如,假设类型类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] = ???
}

1 个答案:

答案 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

这也应该解决你问题的第二部分,缺点是现在一个特征被捆绑到另一个特征。