问题描述
假设我具有以下特征和对象:
trait T {
val x: Int
println("In Trait",x)
}
object Obj extends T{
val y: Int = 10
val x: Int = y
def run() = {
println("In Obj",x)
}
}
Obj.run()
// (In Trait,0)
// (In Obj,10)
我是否可以使特征x
中的T
值与对象x
中的Obj
值相同?换句话说,我的预期输出应为:
// (In Trait,10)
// (In Obj,10)
假设y
的值仅在运行时已知。
解决方法
看到(In Trait,0)
的原因是在特征初始化期间以及对象分配值之前打印值。在这种情况下,您将获得默认值0
。如果它是一个对象,则会得到一个空指针异常。
对象初始化后,x
的值在对象和特征中都相同。
尝试早期的初始化程序
trait T {
val x: Int
println("In Trait",x)
}
object Obj extends {
val y: Int = 10
override val x: Int = y
} with T {
def run() = {
println("In Obj",x)
}
}
Obj.run()
// (In Trait,10)
// (In Obj,10)