我遇到了一个运行时错误,并想知道这是否是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,但是在这个最小的例子中可能很明显,在更现实的代码中,它可能有点令人困惑.
当你第一次遇到它时会感到困惑,但这是预期的行为.
正常的初始化顺序是首先初始化超级特征中的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.
| 归档时间: |
|
| 查看次数: |
76 次 |
| 最近记录: |