从trait覆盖隐式val

时间:2016-11-23 15:59:40

标签: scala

我需要覆盖隐含在对象 res 中的一个隐藏一个特征的特征。目的是在一个地方定义自定义含义(特质B )。 Trait a 在外部库中定义。有可能吗?

trait t {
}

object m extends t
object q extends t

trait a {
  implicit val o: t = m
}

trait b {
  implicit val o: t = q
}

trait c {
  def action(implicit v: t): Unit  = {} 
}

object res extends c with a with b {
  //i need smth like override val o = super[b].o
  val ololo= action
}

1 个答案:

答案 0 :(得分:3)

不可能混合两个不相关的特征,这两个特征都包含具有相同标识符的成员。在这种情况下,Scala编译器无法解决哪一个优先。由于类型Bo是相关的,B甚至不需要在两者中都具有相同的类型。特征A需要延长o并覆盖trait T case object M extends T case object Q extends T trait A { implicit val o: T = M } trait B extends A { override implicit val o: T = Q } trait C { def action(implicit v: T): Unit = println(v) } object Res extends C with B { def call() = action } scala> Res.call() Q 。没有任何其他方法可以在不使用继承的情况下覆盖成员。

A

由于您已将Res混合到A ,因此假定Res不难扩展,因为{{1}}必须实施任何其他未提及的抽象成员。