Scala 如何使隐式和显式相同的值在两者混合时对齐
假设以下情况Scala 如何使隐式和显式相同的值在两者混合时对齐,scala,traits,composition,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
- 我有一个特征a和一个特征B,它们都声明了一个具有相同名称和类型的值
- A显式定义值,而B隐式定义值
- A和B来自外部库,不能更改。我不想用叉子叉
- 我想在我自己的代码中的C类中使用这两种方法
// 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的帮助下)
现在剩下的唯一问题是,我如何让foo位于类C的隐式作用域中 您可以覆盖
隐式变量,如:
// My class
class C extends A with B {
override implicit val foo = "My Value"
}
您只需覆盖隐式
变量,如:
// My class
class C extends A with B {
override implicit val foo = "My Value"
}
理想情况下,您可以使用super[Name]
选择所需的实现。但对于VAL来说,这是行不通的
因此,如果您真的需要C
中的一些隐式String
,我建议让线性化完成它的工作,并定义另一个隐式val
class C extends A with B {
implicit val bar = foo
}
理想情况下,您可以使用super[Name]
选择所需的实现。但对于VAL来说,这是行不通的
因此,如果您真的需要C
中的一些隐式String
,我建议让线性化完成它的工作,并定义另一个隐式val
class C extends A with B {
implicit val bar = foo
}
到底是什么问题?如果您不希望foo
在C
中是隐式的,那么类C用B扩展了A
就行了。A给了我一个foo,而B要求隐式定义一个foo。但是,由于它们的名称相同,我不知道如何将A.foo的值指定给B.foo?在类C中,只有一个foo
用B扩展了A,它的值为“ok”
。从B
的角度来看,foo
是隐含的。从C
或A
上看,这并不是隐含的。这让我们看到了一些曙光!如何使隐式版本进入范围?这似乎不取决于我堆叠特征的方式吗?从我的实验中,我认为隐含性是C
取决于foo
的实现方式。编译器似乎选择了非抽象对象的隐式(或隐式,或…)。我将发布一个可能的解决方法。问题到底是什么?如果您不希望foo
在C
中是隐式的,那么类C用B扩展了A
就行了。A给了我一个foo,而B要求隐式定义一个foo。但是,由于它们的名称相同,我不知道如何将A.foo的值指定给B.foo?在类C中,只有一个foo
用B扩展了A,它的值为“ok”
。从B
的角度来看,foo
是隐含的。从C
或A
上看,这并不是隐含的。这让我们看到了一些曙光!如何使隐式版本进入范围?这似乎不取决于我堆叠特征的方式吗?从我的实验中,我认为隐含性是C
取决于foo
的实现方式。编译器似乎选择了非抽象对象的隐式(或隐式,或…)。我将发布一个可能的解决方法。好的,很好,但是现在我如何从特质a中获得价值呢?override implicit val foo=foo不太好,但是现在我如何从那里的特征A中获得值呢?override implicit val foo=foo不起作用谢谢,非常有用!谢谢,真的很有帮助!