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

时间:2017-06-23 09:50:48

标签: scala traits composition

假设以下情况

  • 我有一个特征A和一个特征B,它们都声明了一个具有相同名称和类型的值。

  • A显式定义值,而B隐式定义

  • A和B来自外部库,无法更改。我不想分叉。

  • 我想在我自己的代码中的C类中使用它们

如何让它们在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进入C类的隐式范围?

2 个答案:

答案 0 :(得分:2)

理想情况下,您可以使用super[Name]选择所需的实施方案。但对于不起作用的val 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
}

因此,如果你真的需要String中的一些隐式C,我建议让线性化做它的事情并定义另一个隐含的val。

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

答案 1 :(得分:0)

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

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