请考虑以下代码:
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中编译,因为“在类型=>字符串的特征A中重写方法工作;方法工作具有不兼容的类型”。
如何选择一种特定的方法?
答案 0 :(得分:15)
我担心没有办法做到这一点。仅当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
答案 1 :(得分:6)
如果Scala声明了一个名称相同且签名不兼容的方法,则Scala会阻止您将A
和B
混合在一起。
答案 2 :(得分: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
}
}
答案 3 :(得分: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
}