Android 如何在类上使用Kotlin扩展函数?

Android 如何在类上使用Kotlin扩展函数?,android,function,class,kotlin,extension-function,Android,Function,Class,Kotlin,Extension Function,我有一个关于扩展函数的非常简短的问题,它可以帮助我清除一些代码。基本上,我对类名的hashCode进行了一些转换,我需要一个扩展函数来完成这些转换 例如: 获取名称hashCode:StateA::class.java.name.hashCode()其中StateA是一个简单的类 我希望扩展函数如下所示: fun Class<*>.transformName(): String { var hashString = this.javaClass.name.has

我有一个关于扩展函数的非常简短的问题,它可以帮助我清除一些代码。基本上,我对类名的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
    }
fun Class.transformName():字符串{
var hashString=this.javaClass.name.hashCode()
//在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()

您已经在类类型上创建了扩展,
StateA
不是类的类型
StateA::class.java
是一个有效的类类型对象。
StateA::class.java.transformName()
现在可以工作了。是的,它确实有效。函数中的字符串类似于
this.name.hashCode()
现在我明白了。谢谢我认为这三种解决方案都是好的。我想我会在每个类中创建一个伴生对象(如您所说),并以类似于
StateA.transformName()
的简单方式使用它。我将记录一些事情,以确保它不会导致任何问题,但其他两个解决方案在代码实践方面也很好。非常感谢,先生!也许不是。如果我仔细想想,更干净的解决方案是你最后一个具体化的解决方案。我不认为仅仅为了某个函数而添加一些无用的伴生对象实际上是一种好的做法。在类中添加伴生对象来像这样对其进行扩展(这就是为什么
kotlin.Boolean
有伴生对象的原因),但是的,对几个类来说这样做可能会很乏味,只是为了让它们与这个扩展一起使用。
inline fun <reified T> transformName() {
    val clazz: Class<*> = T::class.java
    clazz.name.hashCode()
}

transformName<StateA>()