在Scala中声明var不能为null或None

时间:2019-04-17 13:29:36

标签: scala

所以我有一个特质,我需要在其中有具体的成员变量。不过,这些变量是通过init方法分配的。因此,当我声明它们时,必须将它们分配为null。另一个选择是使用“无”,但随后我必须将它们声明为Option [T],我也不想要。

所以,我的问题是,我可以在Scala中将尚未分配的var声明为null还是None吗?

2 个答案:

答案 0 :(得分:3)

我的第一个尝试是使用abstract class

abstract class Test(arg1: Int, arg2: String) {

   val calculatedInConstructor1 = ??? // use args here
   val calculatedInConstructor2 = ??? // use args here
}

new Test(1, "test") {}

如果由于某些原因无法实现,那么仍然可以使用类似的方法实现:

trait Test {

  // have to be provided in implementation
  protected val arg1: Int
  protected val arg2: String

  // lazy will defer initialization so you can provide
  // arg1 and arg2 in class extending Test
  lazy val calculatedOnFirstUse1 = ??? // use args here
  lazy val calculatedOnFirstUse2 = ??? // use args here
}

new Test {
  val arg1 = 1
  val arg2 = "test"
}

没有理由使用varnull等。

答案 1 :(得分:0)

您可以将它们定义为方法:

 trait Test {

  def arg1: Int
  def arg2: String

}

val x=new Test {
  def arg1=1
  def arg2 = "test"
}

您还可以将其覆盖为val

val y=new Test {
  val arg1=2
  val arg2="test2"
}

val z= new Test{
  val arg1=3 // won't compile
}
x.arg1
x.arg2
y.arg1
y.arg2