trait实例抛出空指针

Pen*_*gin 4 scala

为什么下面的代码中出现空指针异常?

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,那就没关系.

Rex*_*err 7

字段按照它们混合的顺序初始化 - 所以首先发生特征中的所有内容,然后将val其分配给Seq(1,2,3)(因为您实际上混合了一个匿名特征).

正如你所发现的那样,lazy val往往是摆脱这种混乱的一种方法:seq.size在你需要它之​​前,你实际上并没有打电话,这是在你填充了这个seq领域之后.


som*_*ytt 6

风格建议是为了避免特征中的val,有利于defs和lazy vals,因为init命令地雷.

对话示例:https://groups.google.com/forum/?fromgroups =#!topic / scala-user / nrOrjPOYmb0