假设以下情况
我有一个特征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类的隐式范围?
答案 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"
}