1

我有不可变的类 Outer 和 Inner 如下:

class Outer(val intra: Outer#Inner) {
    class Inner(val q: Int)
}

我想创建一个相互引用的 Outer 和 Inner 实例,如下所示:

val outer = new Outer(inner)
val inner = new outer.Inner(5)

但是,当然,此代码不会编译,因为值“inner”在第一行中被引用,然后在第二行中定义。

如果我在这两行的“val”关键字之前添加了“lazy”关键字,它会编译,但会在运行时产生堆栈溢出异常。

我知道如果我让类 Outer 像这样可变,我可以解决这个问题:

class Outer(var intra: Outer#Inner) {
    class Inner(val q: Int)
}
val outer = new Outer()
val inner = new outer.Inner(5)
outer.intra = inner

但我想保持类不可变。我怎么解决这个问题?

4

1 回答 1

2

您可以像这样更改定义:

class Outer(_intra: => Outer#Inner) {
  lazy val intra = _intra
  class Inner(val q: Int)
}
于 2013-01-25T18:28:49.140 回答