Исключение NullPointerException при доступе к переопределенному значению в абстрактном конструкторе

Рассмотрим следующий (упрощенный) пример:

abstract class Bar[T] {
    val f: PartialFunction[T, T]
    val default: PartialFunction[T, T] = { case x => x }
    val chained = f orElse default
}

class Foo extends Bar[Int] {
    val f: PartialFunction[Int, Int] = { case 1 => 2 }
}

И посмотрите, как он вылетает:

scala> val foo = new Foo
java.lang.NullPointerException
        at Bar.<init>(<console>:8)
        at Foo.<init>(<console>:6)
        at .<init>(<console>:7)
        at .<clinit>(<console>)
        at RequestResult$.<init>(<console>:9)
        at RequestResult$.<clinit>(<console>)
        at RequestResult$scala_repl_result(<console>)
        ....

Однако, если мы поместим в цепочку в конкретный класс:

abstract class Bar[T] {
    val f: PartialFunction[T, T]
    val default: PartialFunction[T, T] = { case x => x }
}

class Foo extends Bar[Int] {
    val f: PartialFunction[Int, Int] = { case 1 => 2 }
    val chained = f orElse default
}

Он работает, как ожидалось :

scala> val foo = new Foo
foo: Foo = Foo@16132c4

Должен признаться, я совершенно не понимаю, что здесь происходит. Ошибка? (Это в Scala 2.8.1.)

6
задан Knut Arne Vedaa 15 January 2011 в 20:35
поделиться