如何在 class 上使用 Kotlin 扩展函数?
How to use a Kotlin extension function on a class?
我有一个非常简短的问题,关于一个有助于清除我的一些代码的扩展函数。基本上我对 class 名称的 hashCode 进行了一些转换,我想要一个扩展函数来进行转换。
示例:
获取名称 hashCode: StateA::class.java.name.hashCode()
其中 StateA 是一个简单的 class.
我想要这样的扩展功能:
fun Class<*>.transformName(): String {
var hashString = this.javaClass.name.hashCode()
//Do my stuff on that hashString
return hashString
}
但这似乎不起作用。当我使用 StateA.transformName()
应用扩展函数时,该函数给我一个未解析引用的错误。
我尝试了各种方法,例如将函数应用于 StateA::class
或使 hashString 等于 this::class.java.name.hashCode()
,但没有任何效果。有什么建议吗?
你不能真的实现StateA.transformName()
语法,因为StateA
本身指的是[=25=里面的伴生对象].因此,要获得该语法,您需要在要使用此扩展的每个 class 中都有一个伴随对象。
您可以用非常一般的方式做的是首先获取描述您的 class 的 KClass
。这为您提供了一个对象(KClass
实例),然后您可以在该对象上调用扩展:
fun KClass<*>.transformName() {
val clazz: Class<*> = this.java
clazz.name.hashCode()
}
StateA::class.transformName()
另一种在调用站点上不那么冗长的方法可以是像这样的通用函数,其中 reified
关键字允许您访问用作通用类型的具体 class函数内参数:
inline fun <reified T> transformName() {
val clazz: Class<*> = T::class.java
clazz.name.hashCode()
}
transformName<StateA>()
我有一个非常简短的问题,关于一个有助于清除我的一些代码的扩展函数。基本上我对 class 名称的 hashCode 进行了一些转换,我想要一个扩展函数来进行转换。
示例:
获取名称 hashCode: StateA::class.java.name.hashCode()
其中 StateA 是一个简单的 class.
我想要这样的扩展功能:
fun Class<*>.transformName(): String {
var hashString = this.javaClass.name.hashCode()
//Do my stuff on that hashString
return hashString
}
但这似乎不起作用。当我使用 StateA.transformName()
应用扩展函数时,该函数给我一个未解析引用的错误。
我尝试了各种方法,例如将函数应用于 StateA::class
或使 hashString 等于 this::class.java.name.hashCode()
,但没有任何效果。有什么建议吗?
你不能真的实现StateA.transformName()
语法,因为StateA
本身指的是[=25=里面的伴生对象].因此,要获得该语法,您需要在要使用此扩展的每个 class 中都有一个伴随对象。
您可以用非常一般的方式做的是首先获取描述您的 class 的 KClass
。这为您提供了一个对象(KClass
实例),然后您可以在该对象上调用扩展:
fun KClass<*>.transformName() {
val clazz: Class<*> = this.java
clazz.name.hashCode()
}
StateA::class.transformName()
另一种在调用站点上不那么冗长的方法可以是像这样的通用函数,其中 reified
关键字允许您访问用作通用类型的具体 class函数内参数:
inline fun <reified T> transformName() {
val clazz: Class<*> = T::class.java
clazz.name.hashCode()
}
transformName<StateA>()