2016-03-07 154 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 
    } 
}