下面的代码会抛出一个java.lang.NullPointerException异常,因为trait被过早地初始化了。
然而,下面的简单更改可以解决这个问题,但我不明白为什么。
我发现这篇关于覆盖值为NULL的文档,但似乎不适用于上述示例,因为修复不涉及在超类接口中定义的变量。
另外,上面提出的解决方案是否是反模式?作为开发特质的人,我应该如何强制要求抽象值而不会让实现子类的用户感到惊讶,可能会导致
注意:我正在使用Scala版本2.13.0
trait DummyTrait {
def intSeq: Seq[Int]
require(intSeq.exists(_ > 2))
}
object Dummy extends DummyTrait {
val extraIntSeq: Seq[Int] = Seq(-2,-3)
override def intSeq = Seq(1,0,4) ++ extraIntSeq
}
Dummy.intSeq
然而,下面的简单更改可以解决这个问题,但我不明白为什么。
trait DummyTrait {
def intSeq: Seq[Int]
require(intSeq.exists(_ > 2))
}
object Dummy extends DummyTrait {
lazy val extraIntSeq: Seq[Int] = Seq(-2,-3) // using `def` also works
override def intSeq = Seq(1,0,4) ++ extraIntSeq
}
Dummy.intSeq
我发现这篇关于覆盖值为NULL的文档,但似乎不适用于上述示例,因为修复不涉及在超类接口中定义的变量。
另外,上面提出的解决方案是否是反模式?作为开发特质的人,我应该如何强制要求抽象值而不会让实现子类的用户感到惊讶,可能会导致
NullPointerException
?注意:我正在使用Scala版本2.13.0