Kotlin中ReadWriteProperty的R泛型应如何正确使用?
关于Kotlin中ReadWriteProperty泛型参数R的使用观察
我在实际开发里接触到的所有ReadWriteProperty实现场景中,泛型参数R全被定义成Any或者Any?,而且实现代码里的thisRef参数(类型为R)从来没被实际调用过。
先给大家贴一下Kotlin源码里ReadWriteProperty的官方定义:
/** * 用于实现读写属性委托的基础接口。 * * 此接口仅为方便提供;只要你的属性委托拥有相同签名的方法, * 就无需实现此接口。 * * @param R 持有委托属性的对象类型。 * @param T 属性值的类型。 */ public interface ReadWriteProperty<in R, T> { /** * 返回指定对象的属性值。 * @param thisRef 请求属性值的对象。 * @param property 属性的元数据。 * @return 属性值。 */ public operator fun getValue(thisRef: R, property: KProperty<*>): T /** * 设置指定对象的属性值。 * @param thisRef 要设置属性值的对象。 * @param property 属性的元数据。 * @param value 要设置的属性值。 */ public operator fun setValue(thisRef: R, property: KProperty<*>, value: T) }
这里得说清楚,R这个泛型参数的设计初衷是用来指定持有该委托属性的对象类型,但很多时候我们写的通用委托并不需要依赖持有对象的任何特性——比如常见的Delegates.observable这类通用委托,它们只关心属性值本身,不需要访问持有属性的对象,所以就直接把R设成最宽泛的Any或者Any?,自然也不会去调用thisRef参数。
当然,如果你的委托逻辑需要和持有属性的对象交互(比如根据对象的状态来决定属性值的读写逻辑),那这时候R就应该指定成具体的对象类型,thisRef也会派上用场。只是这类场景相对少一些,所以才会出现大部分实现里R都是Any/Any?且thisRef被闲置的情况。
内容的提问来源于stack exchange,提问作者Shalbert
相关产品推荐
相关产品推荐

