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

标签 android function class kotlin extension-function

我有一个关于扩展函数的非常简短的问题,这将有助于清除我的一些代码。基本上我对类名的 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/

相关文章:

java - 如何创建通知 channel 组?

c++ - 使用指向非静态成员函数的函数指针时,可以省略 "this"关键字吗

javascript - 我被困在一个 JavaScript 函数中,该函数应该计算数组中的所有唯一项

Bintray 上的 Android 库缺少源和 javadoc

java - android.os.NetworkOnMainThreadException 如何调整在单独线程中运行的代码

python - 如何将嵌套函数作为参数传递

objective-c - 关于objective-c中 "strong"属性的问题

Java从子类中获取String

C++继承,将成员添加到派生类并重新定义构造函数

android - 为不同的线程创建数据库的构造函数