在一种方法中,我想接收 KMutableProperty 作为参数并为其赋值。
另一个问题是将参数传递给这种方法的正确方法是什么。
基本上我想要这样的东西:
class MyBinder {
...
fun bind(property: KMutableProperty<Int>): Unit {
property.set(internalIntValue)
}
}
然后在另一个类中调用它
myBinder.bind(this::intProperty)
最佳答案
Kotlin 1.0 不允许 this::intProperty
语法,但目前正在工作中,并将很快作为 1.1 早期访问预览的一部分提供( issue , KEEP proposal )。
考虑到这一点,我会考虑以另一种方式执行您所描述的操作,例如制作 bind
接受一个设置属性的 lambda:
class MyBinder {
fun bind(setProperty: (Int) -> Unit) {
setProperty(internalIntValue)
}
}
...
myBinder.bind { intProperty = it }
无论如何,回答您关于设置
KMutableProperty
值的问题: 要设置某个属性的值,或者从技术上讲,调用属性 setter ,您应该知道它的数量,或者该属性(及其 getter/setter)接受的参数数量。文件中声明的属性不接受任何参数,成员属性和扩展属性需要一个参数(接收器实例),而扩展的成员属性需要两个参数。这些属性由 KMutableProperty
的以下子类型表示分别为:KMutableProperty0
, KMutableProperty1
, KMutableProperty2
-- 数字表示arity,它们的泛型类型参数表示接收者的类型。这些属性类型中的每一个都有一个 set
方法和相应的参数。一些例子:fun setValue(property: KMutableProperty0<Int>, value: Int) {
property.set(value)
}
fun setValue(property: KMutableProperty1<SomeType, Int>, instance: SomeType, value: Int) {
property.set(instance, value)
}
注意没有
set
(或 get
)摘要中的方法 KMutableProperty
接口(interface)正是因为它不可能声明它,不知道所需的接收器参数的数量。
关于kotlin - 如何为 KMutableProperty 参数赋值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37751966/