如何迭代类层次结构?

我想遍历类层次结构并打印所有的超类:

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方法。

我曾尝试使用Java的superclass

  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调用将返回一个类型in投影 ,你将无法调用它的.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 } }