17

考虑下面的代码:

trait A {
  def work = { "x" }
}

trait B {
  def work = { 1 }
}

class C extends A with B {
  override def work = super[A].work
}

C不会在 scala 2.10 中编译,因为“在类型 => String 的 trait A 中覆盖方法工作;方法工作具有不兼容的类型”。

如何选择一种具体的方法?

4

4 回答 4

17

恐怕没有办法做到这一点。该super[A].work方法仅在A并且B具有相同的返回类型时才有效。

考虑一下:

class D extends B

....

val test: List[B] = List(new C(), new D())
test.map(b => b.work) //oops - C returns a String, D returns an Int
于 2013-10-03T07:36:27.097 回答
6

你不能在 Scala 中做到这一点。

解决此问题的方法是将特征用作协作者

trait A {
  def work = { "x" }
}

trait B {
  def work = { 1 }
}

class C {
  val a = new A { }
  val b = new B { }

  a.work
  b.work
}
于 2015-01-25T19:49:49.320 回答
6

如果它们声明了具有相同名称和不兼容签名的方法,AScala只会阻止您将它们混合在一起。B

于 2013-10-03T07:33:44.113 回答
6

你不能那样做。

看这段代码:

val c = new C
val a: A = c
val b: B = c

两条线都无法正常工作:

val s: String = a.work
val i: Int = b.work

如果我们允许这样的代码编译,其中一个分配将不得不以ClassCastException另一种方式抛出或失败。因此,根本不可能解决这种冲突。

我想你必须通过某种形式的委派来解决这个问题,也许是这样的:

class C extends A {
  def toB = new B {
    //implement B methods by somehow delegating them to C instance
  }
}
于 2013-10-03T07:36:53.620 回答