Как перебирать иерархию классов?

Я хочу перебирать иерархию классов и печатать все супер-классы:

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 } } 

но у Kotlin KClass нет метода superclass .

Я попытался использовать superclass из Java:

  currentClass = currentClass.java.superclass.kotlin 

но это вызывает ошибку компиляции:

 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 

Так, может ли кто-нибудь объяснить мне, как это сделать?

Сначала укажите явный тип для var currentClass чтобы избежать его вывода как KClass<C> :

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

Затем вызов superclass вернет тип с проекцией , и вы не сможете вызвать его .kotlin . Так что приведение к звездному типу также поможет:

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

Полный метод:

 fun main(args: Array<String>) { var currentClass: KClass<*> = C::class while (currentClass != Any::class) { println(currentClass) currentClass = (currentClass.java.superclass as Class<*>).kotlin } } 
Intereting Posts
Какой самый элегантный способ удалить слушателя из списка из обратного вызова Привязка данных Android к Kotlin, BaseObservable и пользовательский делегат Лямбда-тип с неизвестным числом аргументов Исключение UninferredParameterTypeConstructor во время сборки, когда общие параметры не указаны явно Как я могу называть класс java как A: extends B реализует C в kotlin Как я могу сделать разрыв строки (продолжение строки) в Котлине ERROR: error.NonExistentClass Kotlin В проекте с несколькими модулями Dagger Как мне выполнить компиляцию пакетов в Maven? Как преодолеть ошибку «такой же JVM-подписи» при реализации интерфейса Java? Геттеры и сеттеры в Котлине BLE не может подключиться к уже подключенному устройству Сбой приложения при повороте экрана Почему Котлин компилируется быстрее, чем Scala? Свойство, которое изменяет a от var до val, когда ни одно значение null не назначено? Свойства Kotlin не могут быть переопределены с помощью subinterface