我想遍历类层次结构并打印所有父类(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/

10-13 07:45
查看更多