I want to iterate over class hierarchy and print all super classes:
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
}
}
but Kotlin KClass doesn't have superclass method.
I have tried to use superclass from Java:
currentClass = currentClass.java.superclass.kotlin
but it cause compilation error:
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
So, can anybody explain me how to do it?
First, specify explicit type for var currentClass to avoid its inference as KClass<C>:
var currentClass: KClass<*> = C::class
Then, superclass call will return a type with in projection, and you won't be able to call .kotlin on it. So a cast to star-projected type will also help:
currentClass = (currentClass.java.superclass as Class<*>).kotlin
Complete method:
fun main(args: Array<String>) {
var currentClass: KClass<*> = C::class
while (currentClass != Any::class) {
println(currentClass)
currentClass = (currentClass.java.superclass as Class<*>).kotlin
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With