如何在混合时获得隐式和显式相同的值以对齐

How to get implicit and explicit identical value to align when both being mixed in

假设以下情况

如何让它们在 class C 中对齐? 我希望 B.foo 成为 A.foo

的值
// External code, cant touch
trait A{
  val foo = "boom"
}
trait B{ 
  implicit val foo: String
}

// My class
class C extends A with B {
  //uh oh??
}

更新(在 Jasper-M 的帮助下)

// External code, cant touch
trait A{
  val foo = "boom"
}
trait B{
  implicit val foo: String

  def implBang()(implicit s: String) = s

  def doTheBang() = implBang()
}

// My class
class C extends B with A {}

new C().doTheBang; // Prints "boom"

现在只剩下一个问题了,我怎样才能让 foo 进入 class C 的隐式作用域?

您可以只覆盖 implicit 变量,例如:

// My class
class C extends A with B {
  override implicit val foo = "My Value"
}

理想情况下,您可以 select 使用 super[Name] 实现您想要的实现。但是对于不起作用的 vals for some reason.

class C extends A with B {
  override implicit val foo = super[A].foo
  // error: super may not be used on value foo
}

因此,如果您真的需要 C 中的一些隐式 String,我建议只让线性化完成它的工作并定义另一个隐式 val。

class C extends A with B {
  implicit val bar = foo
}