3

我遇到了一个值初始化问题:

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。谁能帮我 ?

4

2 回答 2

5

肺,

你的懒惰和名字调用的代码是什么样子的?它对我有用:

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
于 2012-06-30T10:30:11.023 回答
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对象和类。

于 2012-06-30T12:01:45.207 回答