Проблема с вашим кодом заключается в том, что вы объединяете типы thisRef
и самого свойства. thisRef
- это любой объект, имеющий свойство, которое делегируется. В большинстве случаев вы просто сделаете его типа Any
, чтобы ваш делегат мог использоваться в любом классе, который вам нравится. Но если у вас был специальный тип делегата, который работает только для определенного типа класса, вы могли бы использовать этот тип для thisRef
, а затем в операторных функциях вы могли бы, чтобы ваш получатель и / или установщик вызывал другие функции класса или делать другую работу.
Так что, чтобы исправить вашу, вам просто нужно изменить thisRef
на Any
.
class AccessOnce <T> {
var storedValue: T? = null
operator fun getValue(thisRef: Any, property: KProperty<*>): T? {
val retVal = storedValue
storedValue = null
return retVal
}
operator fun setValue(thisRef: Any, property: KProperty<*>, value: T?) {
storedValue = value
}
}
Кстати, getValue
может быть однострочным:
operator fun getValue(thisRef: Any, property: KProperty<*>): T? =
storedValue.also { storedValue = null }