【问题标题】:Conflicting fields in Scala TraitsScala Traits 中的冲突字段
【发布时间】:2017-02-24 05:22:22
【问题描述】:

我了解 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


【解决方案1】:

嗯,不像你所看到的那样神奇。如果这是 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 时,编译器无法证明它会覆盖其他xs,那么它将把解决这个问题的工作留给你。它还提出了一种解决方案:

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

这样您将覆盖所有不同的xs 并消除歧义。

【讨论】:

  • 请看我的回答!
【解决方案2】:

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
              ^

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

【讨论】:

    猜你喜欢
    • 2011-06-07
    • 2017-05-31
    • 1970-01-01
    • 1970-01-01
    • 2020-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多