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」が 2 行目に定義される前に 1 行目に参照されているため、コンパイルされません。

また、これら 2 行の「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 に答える