а также

я есть абстрактный класс с нереализованным методом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 разрешает эту небезопасную операцию?

Ответы на вопрос(1)

Ваш ответ на вопрос