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



给定以下特性,实例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))

基于这篇StackOverflow文章,我尝试了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)
}

但均给出CCD_ 4。

有没有一种方法可以将前置条件(require子句(用于特征中未初始化值的属性,或者我必须将前置条件复制到实现该特征的所有类?

假设ldef,解决问题的一种方法如下:

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

您可以按照以下方式轻松完成此操作:

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))

相关内容

  • 没有找到相关文章

最新更新