traitの名前衝突

scalaでtraitを使おうと思ったが、複数のtraitが同名のメソッドを持っていて、それらを継承して当該メソッドを呼ぶとどうなるか。

trait Aoo {
def zoo = 1
}

trait Boo {
def zoo = 2
}

object Coo extends Aoo with Boo {
def main(args:Array[String]) {
println(zoo)
}
}

と定義して実行すると

scala> Loading /Users/yano/project/scala/trait.scala...
defined trait Aoo
defined trait Boo
:9: error: overriding method zoo in trait Aoo of type => Int;
method zoo in trait Boo of type => Int needs `override' modifier
object Coo extends Aoo with Boo {
^
2

scala>

となってエラー。でも、どのtraitとどのtraitでメソッド名の衝突が起きているかを探し出すのも大変かと思ったら、コンパイラが教えてくれるのでだいじょうぶだった。

こういう場合は、どちらのメソッドを使うかを明示できる。

object Coo extends Aoo with Boo {
override def zoo = super[Boo].zoo
def main(args:Array[String]) {
println(zoo)
}
}

scala> Loading /Users/yano/project/scala/trait.scala...
defined trait Aoo
defined trait Boo
defined module Coo
2

scala>