Kotlin中带有val的循环引用 [英] Circular references with vals in Kotlin

查看:98
本文介绍了Kotlin中带有val的循环引用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在Kotlin中,说我有data class A (val f: B)data class B (val f: A).我想初始化本地var a: Avar b: B,以使a.fbb.fa. A.fB.f必须保留为val.这种循环实例化可能吗?

In Kotlin, say I have data class A (val f: B) and data class B (val f: A). I want to initialize local var a: A and var b: B such that a.f is b and b.f is a. A.f and B.f must remain vals. Is this circular instantiation possible?

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 ??
}

推荐答案

不完全是您想要的,但是应该可以工作:

Not exactly what you want but should work:

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
}

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

If you do not care about data class properties being vals, you can get rid of interfaces and use just implementation classes.

这篇关于Kotlin中带有val的循环引用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆