Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to iterate over class hierarchy?

Tags:

kotlin

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?

like image 477
Maxim Avatar asked Dec 14 '25 15:12

Maxim


1 Answers

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
    }
}
like image 134
hotkey Avatar answered Dec 16 '25 20:12

hotkey



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!