by shigemk2

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

いい加減どうにかしないといけないリマインダー Scalaの事前定義

yuroyoro.hatenablog.com

// First
trait Greeting {
  val name: String
  val msg = "How are you, "+name
  println(msg)
}
class C extends Greeting {
  val name:String = "Bob"
}
// How are you, null

// Solution with Early Definition
trait Greeting {
  val name: String
  val msg = "How are you, "+name
  println(msg)
}
class C extends {
  val name = "Bob"
} with Greeting
// How are you, Bob

Scalaの仕様では、サブクラスの初期化の前にスーパークラスの初期化が行われるため、上のようなコードになる(このような順番で初期化が行われるのはどうもJVMの仕様らしい)