Вы не можете действительно достичь синтаксиса 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>()