Kotlin 中带有 val 的循环引用

sar*_*ter 5 immutability circular-reference kotlin

在 Kotlin 中,假设我有data class A (val f: B)data class B (val f: A)。我想初始化 localvar a: Avar b: Bisa.fbis b.f。并且必须保留 vals。这种循环实例化可能吗?aA.fB.f

data class A(val f: B)

data class B(val f: A)

fun foo() {
    var a: A
    var b: B
    // instantiate a and b here with a.f == b and b.f == a ??
}
Run Code Online (Sandbox Code Playgroud)

Mic*_*ael 5

不完全是你想要的,但应该有效:

interface A {
  val f: B
}

interface B {
  val f: A
}

data class AImpl(override var f: B) : A

data class BImpl(override var f: A) : B

fun <T> uninitialized(): T = null as T

fun foo() {
  var aImpl = AImpl(uninitialized())
  var bImpl = BImpl(aImpl)
  aImpl.f = bImpl
  val a: A = aImpl
  val b: B = bImpl
}
Run Code Online (Sandbox Code Playgroud)

如果您不关心数据类属性val,则可以摆脱接口并仅使用实现类。