2016-03-07 35 views
9

任何人都可以解釋我如何比較自己的KClasse-s和接口嗎?我知道如何檢查類或接口都是平等的,但我不明白如何檢查類是B級的超等如何比較類和接口?

interface IB {} 
interface IC : IB {} 

open class A {} 
open class B : A() {} 
open class C : B(), IC {} 

fun main(args: Array<String>) { 
    if (B::class == B::class) { println("B class is equal to B class") } 
    if (IB::class == IB::class) { println("IB interface is equal to IB interface") } 

    if (A::class ??? B::class) { println("A class is parent of B class") } 
    if (A::class ??? C::class) { println("A class is superclass of C class") } 

    if (C::class ??? IC) { println("C class is implement IC interface") } 
    if (IC ??? IB) { println("IC interface is implement IB interface") } 
} 
+1

Klutter庫也有Class'和'KClass'的'這些比較擴展以及對'Type'和'KType'你也許會科特林反射遭遇。 https://github.com/kohesive/klutter/blob/master/reflect-core-jdk6/src/main/kotlin/uy/klutter/reflect/Types.kt以及更多https://github.com/kohesive/ klutter/blob/master/reflect-full-jdk6/src/main/kotlin/uy/klutter/reflect/full/Types.kt –

回答

8

科特林反射沒有一個API,用於檢索有關信息KClass層次,所以唯一的辦法,以檢查是否一個KClass是超或其他KClass子類是比較對應的Java類:

interface IB {} 
interface IC : IB {} 

open class A {} 
open class B : A() {} 
open class C : B(), IC {} 

fun main(args: Array<String>) { 
    if (B::class == B::class) { println("B class is equal to B class") } 
    if (IB::class == IB::class) { println("IB interface is equal to IB interface") } 

    if (A::class.java.isAssignableFrom(B::class.java)) { println("A class is parent of B class") } 
    if (A::class.java.isAssignableFrom(C::class.java)) { println("A class is superclass of C class") } 

    if (IC::class.java.isAssignableFrom(C::class.java)) { println("C class is implement IC interface") } 
    if (IB::class.java.isAssignableFrom(IC::class.java)) { println("IC interface is implement IB interface") } 
} 

UPDATE: 您也可以定義兩個擴展功能,將麥Ë這種檢查更好一點的:

inline fun <reified L : Any, reified R : Any> isSubClassOf(): Boolean { 
    return R::class.java.isAssignableFrom(L::class.java) 
} 

inline fun <reified L : Any, reified R : Any> isSuperClassOf(): Boolean { 
    return L::class.java.isAssignableFrom(R::class.java) 
} 

fun main(args: Array<String>) { 
    if (isSubClassOf<B, B>()) { println("B class is equal to B class") } 
    if (isSubClassOf<IB, IB>()) { println("IB interface is equal to IB interface") } 

    if (isSuperClassOf<A, B>()) { println("A class is parent of B class") } 
    if (isSuperClassOf<A, C>()) { println("A class is superclass of C class") } 

    if (isSubClassOf<C, IC>()) { println("C class is implement IC interface") } 
    if (isSubClassOf<IC, IB>()) { println("IC interface is implement IB interface") } 
} 
+1

哇,我期望'compareTo'運算符對於那個過載 – voddan

+0

@voddan你不能爲部分有序集合定義一個'compareTo'運算符 –

+1

@VladimirMironov我認爲@voddan的意思是[this](https://gist.github.com/maxd/8f967002343865dd40a7)。正如你所看到的,可能會重寫'compareTo',並使用'<', '>','<=', '> ='運算符來比較類(例如在Ruby中使用這種語法)。我希望kotlin.reflect將來會有這樣的事情。 –