我嘗試在trait中使用抽象val
來初始化另一個值。我有一個NullPointerException
。我煮的行爲降低到最小的測試案例:如何初始化特徵的減法值?
trait MessagePrinter {
val message: String
println(message)
}
class HelloPrinter extends MessagePrinter {
val message = "Hello World"
}
val obj = new HelloPrinter()
println(obj.message)
這個小程序產生以下結果:
null
Hello World
我的印象是一個VAL可能永遠不會改變。這是預期的行爲還是編譯器錯誤?我怎樣才能解決此問題並在初始化期間打印Hello World
?
可能的解決方法:'lazy val message'或'def message'。不贊成使用'delayedInit'(http://www.scala-lang.org/files/archive/nightly/docs/library/index.html#scala.DelayedInit)有類似的目的。這是一個JVM兼容性工件:http://docs.scala-lang.org/tutorials/FAQ/initialization-order.html –
悲傷懶惰的vals不能抽象。 – Richard