¿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 } } 
  • Cómo comstackr el código de testing de unidad de Kotlin que usa hamcrest 'is'
  • Tengo dos methods de extensión de Kotlin para la misma class, pero con una firma genérica diferente y el comstackdor se queja
  • Cómo llamar al número de teléfono en Kotlin Android
  • ¿Cómo saber si una matriz está vacía?
  • ¿Cómo declarar una class que contiene un campo de tipo genérico en Kotlin?
  • @ Clase enterrable con val en Kotlin
  • Kotlin y la confusión de generics
  • Escuchar posts y escribir commands en un flujo observable
  • Cómo usar la dependency injection en las testings de Spek
  • ¿Hay alguna reference para la complejidad del time de la biblioteca Kotlin Standard Collection?
  • Kotlin: No se puede usar GenericTypeIndicator para llamar al getValue de Firebase Database