为什么下面的代码中出现空指针异常?
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)
}
}
Run Code Online (Sandbox Code Playgroud)
如果我将size字段更改为lazy,那就没关系.
字段按照它们混合的顺序初始化 - 所以首先发生特征中的所有内容,然后将val其分配给Seq(1,2,3)(因为您实际上混合了一个匿名特征).
正如你所发现的那样,lazy val往往是摆脱这种混乱的一种方法:seq.size在你需要它之前,你实际上并没有打电话,这是在你填充了这个seq领域之后.
风格建议是为了避免特征中的val,有利于defs和lazy vals,因为init命令地雷.
对话示例:https://groups.google.com/forum/?fromgroups =#!topic / scala-user / nrOrjPOYmb0
| 归档时间: |
|
| 查看次数: |
681 次 |
| 最近记录: |