trait实例抛出空指针

时间:2012-09-02 20:26:32

标签: 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)
    }
}

如果我将size字段更改为lazy,那就没关系。

2 个答案:

答案 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