¿Cómo iterar sobre la jerarquía de class?

Quiero iterar sobre la jerarquía de classs e imprimir todas las superclasss:

open class A {} open class B : A() {} open class C : B() {} fun main(args: Array<String>) { var currentClass = C::class while(currentClass != Any::class) { println(currentClass) currentClass = currentClass.superclass } } 

pero KClass no tiene método de superclass .

Intenté usar la superclass de Java:

  currentClass = currentClass.java.superclass.kotlin 

pero causa un error de compilation:

 Error:(9, 52) Type inference failed: 'T' cannot capture 'in ('C'..'C?')'. Type parameter has an upper bound 'kotlin.Any' that cannot be satisfied capturing 'in' projection 

Entonces, ¿alguien puede explicarme cómo hacerlo?

Primero, especifique el tipo explícito para var currentClass para evitar su inferencia como KClass<C> :

 var currentClass: KClass<*> = C::class 

Entonces, la llamada de superclass devolverá un tipo con in proyección , y no podrá llamar a .kotlin en él. Por lo tanto, un reparto a tipo proyectado en estrella también ayudará:

 currentClass = (currentClass.java.superclass as Class<*>).kotlin 

Método completo:

 fun main(args: Array<String>) { var currentClass: KClass<*> = C::class while (currentClass != Any::class) { println(currentClass) currentClass = (currentClass.java.superclass as Class<*>).kotlin } } 
  • Crear registrador en el nivel de package sin class
  • Android muestra una advertencia aparentemente inofensiva cuando se reproduce audio?
  • BottomNavigationView enlace a ViewPager, cuando configuro Listener en bottomNavigationView, tengo que hacer clic dos veces para realizar lo que hago
  • Kotlin obtiene valor de JSON
  • Una function con tipo de retorno genérico
  • Atributo Kotlin RuntimeInvisibleParameterAnnotations: MyType (String)
  • Escribir Daos del reino con transactions cerradas
  • Diferentes posiciones de destino cuando se usan diferentes tamaños de vista con ObjectAnimator
  • TimeZone no muestra
  • Llamadas seguras en Kotlin con Array es confuso
  • RxJava BehaviorSubject no emite el último elemento?