2016-03-07 70 views
2

我想遍历类层次结构和打印所有超类:如何迭代类层次结构?

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 
    } 
} 

但科特林KClass没有superclass方法。

我曾尝试使用superclass从Java:

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 

因此,任何人可以解释我怎么办呢?

回答

7

首先,指定明确的类型var currentClass以避免其推断为KClass<C>

var currentClass: KClass<*> = C::class 

然后,superclass调用将返回一个类型with in projection,而您将无法调用.kotlin就可以了。因此,强制转换为star-projected类型也将有所帮助:

currentClass = (currentClass.java.superclass as Class<*>).kotlin 

Complete方法:

fun main(args: Array<String>) { 
    var currentClass: KClass<*> = C::class 
    while (currentClass != Any::class) { 
     println(currentClass) 
     currentClass = (currentClass.java.superclass as Class<*>).kotlin 
    } 
}