根据抽象val的成员定义val(Scala bug?)

est*_*lua 3 scala

我遇到了一个运行时错误,并想知道这是否是Scala中的错误,或者它是否至少应该在编译期间被捕获.此代码生成NullPointerException:

object Main extends App {
  trait A {
    val data: { val x: Int }
    val x = data.x
  }
  val a = new A {
    val data = new Object { val x = 42 }
  }
  a.x
}
Run Code Online (Sandbox Code Playgroud)

当然,通过使Axe懒惰或者很容易修复def,但是在这个最小的例子中可能很明显,在更现实的代码中,它可能有点令人困惑.

Jen*_*alm 5

当你第一次遇到它时会感到困惑,但这是预期的行为.

正常的初始化顺序是首先初始化超级特征中的val.在您的示例中,这意味着val x特征A val data在您的匿名子类之前被初始化,因此导致NullPointer.

如果你想让你的例子工作,你必须使用一个名为"早期定义"的功能(语言规范中的5.1.6).

在您的具体示例中,这是您需要使用的语法:

val a = new {
  val data = new Object { val x = 42 }
} with A  
Run Code Online (Sandbox Code Playgroud)

这在初始化A中的val之前初始化数据val.