我遇到了值初始化问题:
class Top
class X(val v : Top) extends Top
class Y extends Top
X是使用其他Top类型对象(例如X或Y)构造的类。这意味着它可以使用自身构造。例如,
val x = new X(x)
编译器可以工作,但是当我访问v字段时,我返回null。
scala> x.v
res9: Top = null
我尝试了延迟初始化和按名称参数,得到了相同的结果。我的Scala版本是2.9.1。任何人都可以帮助我吗?
答案 0 :(得分:5)
隆,
你的代码如何使用lazy和call-by-name看起来像?它对我有用:
class Top
class X(_v: => Top) extends Top {
lazy val v = _v
}
scala> lazy val x: X = new X(x)
x: X = <lazy>
scala> x.v
res3: Top = X@422d15ad
答案 1 :(得分:0)
这确实很不幸,也发生在Scala 2.9.2中;但是你需要在那里添加类型,所以它是val x: X = new X(x)
。我认为编译器应该明确拒绝这一点,因为它不能通过急切的参数v
成功。
我不知道您的具体情况是什么,但它似乎是一种数据结构。也许像下面这样的方法适合你
trait Top
trait X extends Top { def v: Top }
object TopLoop extends X { def v: Top = this }
class Y( x: X ) extends Top { def v: Top = x }
如果您想使用模式匹配,您还可以将sealed
添加到特征中,并将case
添加到对象和类中。