这可能是Jesse Eichar的blog entry所涵盖的 - 我仍然无法弄清楚如何纠正以下而不诉诸懒惰的vals 以便NPE得到修复:< / p>
鉴于
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!!
第二次尝试,改变mixin顺序
class System2 extends Confluent with Mixin {
val bar = Foo("npe")
}
new System2 // boom!!
现在我非常重视bar
和global
,因此我不想因为Scala(2.9.2)无法正确初始化而支付懒惰税。怎么办?
答案 0 :(得分:11)
您可以使用early initializer:
class System1 extends {
val bar = Foo("npe")
} with Mixin with Confluent {
// ...
}
scala> new System1
res3: System1 = System1@1d0bfedd