3

これはおそらくJesse Eicharのブログ エントリでカバーされています。それでも、NPE が修正されるように遅延 val に頼らずに以下を修正する方法がわかりません。

与えられた

trait FooLike { def foo: String }
case class Foo(foo: String) extends FooLike

trait Sys {
  type D <: FooLike
  def bar: D
}

trait Confluent extends Sys {
  type D = Foo
}

trait Mixin extends Sys {
  val global = bar.foo
}

最初の試み:

class System1 extends Mixin with Confluent {
  val bar = Foo("npe")
}

new System1  // boom!!

2 回目の試行、mixin の順序を変更

class System2 extends Confluent with Mixin {
  val bar = Foo("npe")
}

new System2  // boom!!

現在、私は両方barglobal非常に頻繁に使用しているため、Scala (2.9.2) が初期化を正しく行わないという理由だけで、lazy-val 税を支払いたくありません。何をすべきか?

4

1 に答える 1

11

初期イニシャライザを使用できます:

class System1 extends {
  val bar = Foo("npe")
} with Mixin with Confluent {
  // ...
}

scala> new System1
res3: System1 = System1@1d0bfedd
于 2012-09-28T21:35:16.903 に答える