Kotlin:以函数的形式传递对象作为参照,并改变它的实例

我无法找到如何传递对象的引用,以便我可以让它们指向内存中的新位置。 Kotlin如何做到这一点?

码:

class Parent { } class Child : Parent { } class GlobalDataHolder { var globalChildVriable: Child? = null // imagine this is a static variable and can be accessed anywhere } class Activity() { var variable1 = Child() Helper.init(variable1, GlobalDataHolder.globalChildVriable) // inside onCreate() } class Helper { initStuff(variable1: Parent, globalVariable: Parent?) { if (globalVariable == null) { globalVariable = variable1 // error saying val cannot be re-assigned } else { variable1 = globalVariable!! } } } 

我想要variable1和globalVariable是可以修改的。 所以他们的原始拥有者将有最新的价值。

Kotlin(和Java)本身不支持像C / C ++那样的引用类型。 但是,kotlin确实有属性和功能类型。
一个属性基本上是两个函数的组合(一个吸气和一个setter)。 您可以传递属性作为参数,并通过反射,从不同的上下文分别调用其getter setter。

更新(可编译)代码:

 open class Parent { } open class Child : Parent() { } var globalVariable: Child? = null class Activity() { var localVariable = Child() init { Helper.initStuff(this::localVariable, ::globalVariable) } } object Helper { fun initStuff(localProperty: KMutableProperty0<out Parent>, globalProperty: KMutableProperty0<out Parent?>) { val globalVariable = globalProperty.call() val variable1 = localProperty.call() if (globalVariable == null) { globalProperty.setter.call(variable1) } else { variableProperty.setter.call(globalVariable) } } } 

通过引入更多层次的抽象,可以“解决”这些问题。 你可以例如添加一个新的interface VarHolder ,它负责获取/设置包含的变量。

 interface VarHandle<E> { var variable: E } class Activity() { var variable1 = Child() fun onCreate() { Helper.initStuff(object : VarHandle<Child> { override var variable: Child get() = variable1 set(value) { variable1 = value } }, object : VarHandle<Child?> { override var variable: Child? get() = GlobalDataHolder.globalChildVariable set(value) { GlobalDataHolder.globalChildVariable = value } }) } } object Helper { fun initStuff(localVarHolder: VarHandle<Child>, globalVarHolder: VarHandle<Child?>) { val globalVar = globalVarHolder.variable val localVar = localVarHolder.variable if (globalVar == null) { globalVarHolder.variable = localVar } else { localVarHolder.variable = globalVar } } }