鉴于以下特征,实例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
子句),还是必须将前置条件复制到实现该特征的所有类中?
答案 0 :(得分:2)
假设l
是def
,解决该问题的一种方法是:
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))