我有一个关于扩展函数的非常简短的问题,这将有助于清除我的一些代码。基本上我对类名的 hashCode 进行了一些转换,并且我想要一个扩展函数来执行转换。
示例:
获取名称 hashCode:StateA::class.java.name.hashCode()
其中 StateA 是一个简单的类。
我想要扩展功能,例如:
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
仅单独引用内部的伴生对象那个类。因此,要获得该语法,您需要在要使用此扩展的每个类中都有一个伴生对象。
您可以用一种非常通用的方式做的是首先获取描述您的类的KClass
。这将为您提供一个对象(KClass
实例),然后您可以在其上调用扩展:
fun KClass<*>.transformName() {
val clazz: Class<*> = this.java
clazz.name.hashCode()
}
StateA::class.transformName()
另一种在调用站点上不太详细的方法可能是像这样的泛型函数,其中 reified
关键字允许您访问用作泛型类型参数的具体类功能:
inline fun <reified T> transformName() {
val clazz: Class<*> = T::class.java
clazz.name.hashCode()
}
transformName<StateA>()
关于android - 如何在类上使用 Kotlin 扩展函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58317648/