5

我有一个关于扩展功能的非常简短的问题,这将有助于清除我的一些代码。基本上我对类名的 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()但没有任何效果。有小费吗?

4

1 回答 1

9

您无法真正实现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>()
于 2019-10-10T07:40:16.017 回答