scala - Scala Traits 中的冲突字段

标签 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 with B with D
  println(d.x)
}

上面的代码无法编译。

最佳答案

嗯,不像你所看到的那样神奇。如果这是 A 的属性类,然后你可以覆盖它 - 使用类线性化,你已经知道,每个 with X , 其中 X extends 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 s,那么它将把解决这个问题留给你。它还提出了一种解决方案:
object TraitsEx extends App {
  var d = new A with B with D { override val x = "d" }
  println(d.x)
}

这样你会覆盖所有不同的x s 并消除歧义。

关于scala - Scala Traits 中的冲突字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42425009/

相关文章:

scala - 如何使用 Play 的 json 序列化/反序列化动态字段名称

java - Spark 蓄能器

scala - 为什么递归惰性列表会破坏 Scala 中的堆栈?

scala - Scala Spark 中笛卡尔变换的显式排序

scala - 测试 c.universe.Type 是否可分配给宏中的另一种类型

scala - 在 Scala 中使用 listFiles 只获取文件名

java - Joda-Time 日期时间 欧洲/柏林夏令时

scala - Scala中具有多参数或序列的构造函数?

scala - 对象可以在scala中扩展抽象类吗?