trait Service { trait Logger { def log(message: String): Unit } val logger: Logger def run = { logger.log("Starting " + getClass.getSimpleName + ":") doRun } protected def doRun: Boolean } object MyService1 extends Service { class MyService1Logger extends Logger { def log(message: String) = println("1: " + message) } override val logger = new MyService1Logger def doRun = true def main(args: Array[String]): Unit = { println(doRun) logger.log("hogehoge") } } object MyService2 extends Service { override val logger = MyService1.logger // value logger has incompatible type def doRun = true }
Programming Scalaより。なぜこういうエラーが発生するかというと、traitで定義した変数の型と、それを継承したオブジェクトの中でオーバーライドしようとしている同名の変数の型が違うから。型がパス依存なので、こういう問題が起こるそうな。type mismatchエラーとの違いがよくわかっていません。
Programming Scala: Scalability = Functional Programming + Objects
- 作者: Dean Wampler,Alex Payne
- 出版社/メーカー: O'Reilly Media
- 発売日: 2014/12/03
- メディア: Kindle版
- この商品を含むブログを見る