// 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の仕様らしい)