可以扩展特征中的对象初始化变量

问题描述

假设我具有以下特征和对象:

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)