by shigemk2

当面は技術的なことしか書かない

Scalaのvalue incompatible type

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

Programming Scala: Scalability = Functional Programming + Objects