如何迭代类层次结构?
我想遍历类层次结构并打印所有的超类:
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 } }