为什么下面的代码中会出现空指针异常?
object Test extends App{
trait MyTrait[A]{ self =>
val seq: Seq[A]
val size = seq.size // null pointer here
}
val p = new MyTrait[Int]{
val seq = Seq(1,2,3)
}
}
如果我将size字段更改为lazy,那就没关系。
答案 0 :(得分:6)
字段按照它们混合的顺序初始化 - 所以首先发生特征中的所有内容,然后将val
分配给Seq(1,2,3)
(因为你基本上混合了一个匿名特征)。
正如您所发现的那样,lazy val
通常可以摆脱这种混乱:在您需要之前,您实际上并未调用seq.size
,这是在您填充seq
之后字段。
答案 1 :(得分:5)
风格建议是为了避免特征中的val,因为初始命令地雷,所以有利于defs和lazy val。
示例对话: https://groups.google.com/forum/?fromgroups=#!topic/scala-user/nrOrjPOYmb0