Generics 如何使用ReadWriteProperty中的R泛型类型?
如何使用Generics 如何使用ReadWriteProperty中的R泛型类型?,generics,kotlin,Generics,Kotlin,如何使用R泛型类型?在我看到实现的ReadWriteProperty的任何地方,R被定义为Any或Any?,然后实现中使用typeR的两个部分(以下命名为thisRef)从未使用过 Kotlin的ReadWriteProperty定义如下(代码是从源文件复制/粘贴的): /** *可用于实现读写属性的属性委托的基本接口。 * *这只是为了方便而提供的;您不必扩展此接口 *只要属性委托具有具有相同签名的方法。 * *@param R拥有委托属性的对象类型。 *@param T属性值的类型。 */
R
泛型类型?在我看到实现的ReadWriteProperty
的任何地方,R
被定义为Any
或Any?
,然后实现中使用typeR
的两个部分(以下命名为thisRef
)从未使用过
Kotlin的ReadWriteProperty
定义如下(代码是从源文件复制/粘贴的):
/**
*可用于实现读写属性的属性委托的基本接口。
*
*这只是为了方便而提供的;您不必扩展此接口
*只要属性委托具有具有相同签名的方法。
*
*@param R拥有委托属性的对象类型。
*@param T属性值的类型。
*/
公共接口读写属性{
/**
*返回给定对象的属性值。
*@param thisRef为其请求值的对象。
*@param property属性的元数据。
*@返回属性值。
*/
公共运算符fun getValue(thisRef:R,属性:KProperty):T
/**
*设置给定对象的属性值。
*@param thisRef为其请求值的对象。
*@param property属性的元数据。
*@param value要设置的值。
*/
公共运算符fun setValue(thisRef:R,属性:KProperty,值:T)
}
您可以创建针对特定类型接收器的委托属性。它只能在该类及其子类中使用,但您可以访问它的函数和属性
例如,您可以创建一个类,对使用委托的任何属性的调用进行计数:
open class Ticker {
var ticks = 0
private set
class CountedAccess<T> (private val value: T) : ReadOnlyProperty<Ticker, T> {
override fun getValue(thisRef: Ticker, property: KProperty<*>): T {
thisRef.ticks++
return value
}
}
}
您可以创建针对特定类型接收器的委托属性。它只能在该类及其子类中使用,但您可以访问它的函数和属性。@Tenfour04您能提供一个示例吗?多次重复这个答案,直到我最终找到一个使用它有意义的案例。谢谢:)
open class Ticker {
var ticks = 0
private set
class CountedAccess<T> (private val value: T) : ReadOnlyProperty<Ticker, T> {
override fun getValue(thisRef: Ticker, property: KProperty<*>): T {
thisRef.ticks++
return value
}
}
}
fun main() {
class Something: Ticker() {
val foos by CountedAccess(5)
val bar by CountedAccess("Hello, world!")
}
val something = Something().apply {
repeat(Random.nextInt(3)) {
println("Number of foos is $foos")
repeat(Random.nextInt(3)) {
println("Bar says $bar")
}
}
}
println("Something's properties were accessed ${something.ticks} times.")
}