Scala特征中的冲突字段

Scala特征中的冲突字段,scala,Scala,我理解scala是如何通过考虑上述特征的顺序来解决钻石遗传问题的。我很想了解它是如何解决字段的相同问题的。这就是我想要理解的- class A {print("A")} trait B extends A {print("B") ; val x="b"} trait C extends B {print("C")} trait D extends A {print("D"); val x="d"} object TraitsEx extends App { var d = new A w

我理解scala是如何通过考虑上述特征的顺序来解决钻石遗传问题的。我很想了解它是如何解决字段的相同问题的。这就是我想要理解的-

class A {print("A")}
trait B extends A {print("B") ; val x="b"}
trait C extends B {print("C")}
trait D extends A {print("D");  val x="d"}

object TraitsEx extends App {
  var d = new A with B with D
  println(d.x)
}

上面的代码无法编译

Scala通过使您解决冲突字段来解决冲突字段

Error:(21, 16) <$anon: A$A123.this.A with A$A123.this.B with A$A123.this.D> inherits conflicting members:
  value x in trait B of type String  and
  value x in trait D of type String
(Note: this can be resolved by declaring an override in <$anon: A$A123.this.A with A$A123.this.B with A$A123.this.D>.)
  var d = new A with B with D
              ^
错误:(21,16)继承冲突成员:
字符串类型的特征B中的值x和
字符串类型的特征D中的值x
(注意:这可以通过在中声明重写来解决。)
var d=新A和B以及d
^

如果一个字段应该覆盖另一个字段,则需要将其放入代码中。如果没有指定的覆盖,编译器将不会为您做出任何决定。

这并不像您所看到的那样神奇。如果这是
a
类的一个属性,那么您可以覆盖它-通过类线性化,您已经知道,每个
带有X
,其中
X扩展a
将覆盖值:

trait A {
  val x = "a"
}

trait B extends A {
  override val x = "b"
}

trait C extends A {
  override val x = "c"
}

object Main {
  def main(args: Array[String]): Unit = {
    println((new A {}).x)
    println((new A with B).x)
    println((new A with B with C).x)
  }
}
印刷品

a
b
c
然而,当每个类引入自己的
x
时,编译器无法证明它可以覆盖其他
x
类,那么它将把解决该问题的任务留给您。它还提出了一个解决方案:

object TraitsEx extends App {
  var d = new A with B with D { override val x = "d" }
  println(d.x)
}

通过这种方式,您可以覆盖所有不同的
x
s并消除歧义。

错误消息中没有说明如何修复它吗?请您也将编译错误粘贴到这里好吗?请看我的答案!