我有一个关于扩展功能的简短问题,该功能可以帮助清除一些代码。基本上,我对类名的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 funtransformName() { val clazz: Class<*> = T::class.java clazz.name.hashCode() } transformName ()