gpt4 book ai didi

scala - 根据抽象 val 的成员定义 val(Scala 错误?)

转载 作者:行者123 更新时间:2023-12-01 07:16:08 26 4
gpt4 key购买 nike

我遇到了一个运行时错误,想知道这是否是 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
}

当然,通过使 A.x 变惰性或 def 很容易解决这个问题,但在这个最小的示例中可能很明显,在更实际的代码中它可能有点令人困惑。

最佳答案

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

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

如果你想让你的例子工作,你必须使用一个叫做“早期定义”的功能(语言规范中的 5.1.6)。

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

val a = new {
val data = new Object { val x = 42 }
} with A

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

关于scala - 根据抽象 val 的成员定义 val(Scala 错误?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22439821/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com