【发布时间】:2020-06-25 16:32:42
【问题描述】:
我正在努力将我的头包裹在 Kotlin 代表身上。我发现将它与 generics 一起使用时特别棘手。就我而言,我想要一个可以存储任意类型值的委托。我第一次访问委托属性时,它会返回存储的值。所有后续访问只返回null。如果我再次设置该值,则下一次访问将返回该值,并且所有后续访问操作将再次返回null。它会像这样工作:
val a: Int by AccessOnce() // or String, or Boolean, or whatever
println(a) // null
a = 42
println(a) // 42
println(a) // null
a = 100
println(a) // 100
println(a) // null
这是我目前拥有的代码,但对 getValue 和 setValue 签名不满意。你能帮帮我吗?
import kotlin.reflect.KProperty
class AccessOnce <T> {
var storedValue: T? = null
operator fun getValue(thisRef: T?, property: KProperty<*>): T? {
val retVal = storedValue
storedValue = null
return retVal
}
operator fun setValue(thisRef: Any?, property: KProperty<*>, value: T?) {
storedValue = value
}
}
【问题讨论】:
-
您可以实现
ReadWriteProperty接口以确保您的委托对象具有正确的签名。 -
好的,很酷,但我对
R - the type of object which owns the delegated property感到困惑。这是什么意思? -
ReadWriteProperty是一个接口,所以在getValue函数内部this是(在你的情况下)AccessOnce 类。但是你在其他类中使用val a: Int by AccessOnce()。R必须是拥有a的对象的类型(或超类型)。
标签: kotlin delegates delegation