Mark
02/21/2023, 1:33 PMinterface Foo<T> {
fun getValue(): T
fun removeValue()
fun setValue(value: T) // is there a way to only allow non-null values?
}
interface NonNullFoo<T: Any>: Foo<T>
interface NullableFoo<T: Any>: Foo<T?>
Sam
02/21/2023, 1:33 PMfun setValue(value: T & Any)
Mark
02/21/2023, 1:44 PMval <T> Foo<T>.valueProperty: ReadWriteProperty<Any, T>
get() = object : ReadWriteProperty<Any, T> {
override fun getValue(thisRef: Any, property: KProperty<*>): T {
return getValue()
}
override fun setValue(thisRef: Any, property: KProperty<*>, value: T) {
setValue(value) // compile error: require T & Any
}
}
value == null
val <T> Foo<T>.valueProperty: ReadWriteProperty<Any, T>
get() = object : ReadWriteProperty<Any, T> {
override fun getValue(thisRef: Any, property: KProperty<*>): T {
return getValue()
}
override fun setValue(thisRef: Any, property: KProperty<*>, value: T) {
if (value == null) {
removeValue()
} else {
setValue(value)
}
}
}