预处理(要求)Scala特性中未初始化的值的属性

时间:2018-07-16 13:39:25

标签: scala nullpointerexception require traits illegalargumentexception

鉴于以下特征,实例a抛出NullPointerException

trait T {
  val l: List[Int]

  require(l.size > 1)
}

case class A(list: List[Int]) extends T {
  override val l: List[Int] = list
}

val a = A(List(1,2))

基于this StackOverflow post,我尝试了T的以下变体形式:

trait T {
  def l(): List[Int]

  require(l().size > 1)
}

trait T {
  val l: List[Int]
  lazy val s: Int = l.size

  require(s > 1)
}

trait T {
  val l: List[Int]
  def s: Int = l.size

  require(s > 1)
}

,但是所有人都给NullPointerException

是否可以对特征中未初始化值的属性使用前置条件(require子句),还是必须将前置条件复制到实现该特征的所有类中?

2 个答案:

答案 0 :(得分:2)

假设ldef,解决该问题的一种方法是:

case class A(list: List[Int]) extends {
    val l: List[Int] = list
} with T

答案 1 :(得分:1)

您可以轻松地执行以下操作:

scala> :paste
// Entering paste mode (ctrl-D to finish)

trait T {
  def l: List[Int]
  require(l.size > 1)
}

case class A(l: List[Int]) extends T

val a = A(List(1,2))


// Exiting paste mode, now interpreting.

defined trait T
defined class A
a: A = A(List(1, 2))