我想遍历类层次结构并打印所有父类(super class):
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
调用将返回with in
projection类型,您将无法在其上调用.kotlin
。因此,将类型转换为star-projected也会有所帮助: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
}
}
关于kotlin - 如何遍历类层次结构?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35843266/