4

以下のコードでヌルポインタ例外が発生するのはなぜですか?

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)
    }
}

サイズフィールドを遅延に変更しても問題ありません。

4

2 に答える 2

7

フィールドは、混合された順序で初期化されます。したがって、最初に特性のすべてが発生し、次にvalが割り当てられSeq(1,2,3)ます (本質的に匿名の特性を混合しているため)。

あなたが発見したように、lazy val多くの場合、この混乱から抜け出す方法です:フィールドseq.sizeにデータを入力した後、必要になるまで実際には呼び出しません。seq

于 2012-09-02T20:30:40.893 に答える
6

スタイルの推奨事項は、init オーダー地雷のため、defs と lazy vals を支持して、trait の vals を避けることです。

会話例: https://groups.google.com/forum/?fromgroups=#!topic/scala-user/nrOrjPOYmb0

于 2012-09-03T06:37:26.463 に答える