这个问题在这里已经有了答案:
8年前关闭。
Possible Duplicate:
Scala: forward references - why does this code compile?
object Omg {
class A
class B(val a: A)
private val b = new B(a)
private val a = new A
def main(args: Array[String]) {
println(b.a)
}
}
以下代码打印“null”。在 java 。由于前向引用无效,类似的结构无法编译。问题是 - 为什么它在 Scala 中编译得很好?这是设计使然,在 SLS 中描述还是只是 2.9.1 中的错误?
最佳答案
这不是错误,而是学习 Scala 时的经典错误。当对象Omg
初始化后,首先将所有值设置为默认值(在本例中为 null
),然后运行构造函数(即对象主体)。
要使其工作,只需添加 lazy
您要前向引用的声明前面的关键字(在本例中为值 a
):
object Omg {
class A
class B(val a: A)
private val b = new B(a)
private lazy val a = new A
def main(args: Array[String]) {
println(b.a)
}
}
值
a
然后将根据需要进行初始化。这种构造速度很快(所有应用程序运行时的值只初始化一次)并且是线程安全的。
关于Scala 和前向引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12184997/