如何在 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>()