class InitializationTest {
abstract class Base {
method()
def method(): Unit
}
class Subclass extends Base {
val obj = new Object
override def method(): Unit = {
println(obj) // null
// How to get the Object here?
}
}
@Test
def doTest(): Unit = {
new Subclass()
}
}
在我进行实验时,println(obj)
表达式将输出null
。
我的问题是,如果我需要访问method
Subclass
中的obj。如果不将{i}从val
更改为var
,或者我不能做,我该怎么办?
感谢。
答案 0 :(得分:3)
一种解决方案是将obj
定义为lazy val
。
另一个是使用早期定义:
class Subclass extends {
val obj = new Object
} with Base {
override def method(): Unit = {
println(obj) // not null!
}
}
可以找到这些解决方案(以及其他一些解决方案){。{3}}。
答案 1 :(得分:1)
您需要早期初始化程序
export LC_ALL="en_US.UTF-8"
export LANG="en_US.UTF-8"
您的代码告诉编译器“运行Base的构造函数,然后运行Subclass的构造函数”,导致obj的null访问。
我编写的代码告诉编译器“运行未命名的扩展,然后运行Base的构造函数,然后运行Subclass的构造函数”,因为obj在未命名的扩展中初始化,它在Base获取之前首先应用有机会访问它。