我有一个带有未实现方法的抽象类,该方法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 如何允许这种不安全的操作?