а также
я есть абстрактный класс с нереализованным методомnumbers
это возвращает список чисел, и этот метод используется в другой инициализации свойства val:
abstract class Foo {
val calcNumbers = numbers.map(calc)
def numbers: List[Double]
}
Реализующий класс реализует с помощью выражения val:
class MainFoo extends Foo {
val numbers = List(1,2,3)
}
Это прекрасно компилируется, но во время выполнения выдает исключение NullPointerException и указывает на строкуval calcNumbers
:
[error] (run-main-0) java.lang.ExceptionInInitializerError
[error] java.lang.ExceptionInInitializerError
...
[error] Caused by: java.lang.NullPointerException
...
Однако, когда я изменил реализованный метод на def, он работает:
def numbers = List(1,2,3)
Почему это? Это как-то связано с порядком инициализации? Как этого можно избежать в будущем, поскольку нет ошибок / предупреждений во время компиляции? Как Scala разрешает эту небезопасную операцию?