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类中使用这两种方法

如何使它们在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的帮助下)


现在剩下的唯一问题是,我如何让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不起作用谢谢,非常有用!谢谢,真的很有帮助!