Kotlin odbicie nie posiada API do pobierania informacji o KClass
hierarchia, więc jedynym sposobem, aby sprawdzić, czy jeden KClass
jest nadklasą lub podklasą innej KClass
jest porównanie odpowiednich klas 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: można również zdefiniować dwie funkcje przedłużenia, które MAK e ten rodzaj kontroli nieco ładniejsze:
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") }
}
Klutter Biblioteka posiada także rozszerzenia dla tych porównań 'Class' i' KClass', a także do '' KType' Type' i które mogą wystąpić podczas korzystania z refleksji Kotlin . https://github.com/kohesive/klutter/blob/master/reflect-core-jdk6/src/main/kotlin/uy/klutter/reflect/Types.kt i więcej w https://github.com/kohesive/ klutter/blob/master/reflect-full-jdk6/src/main/kotlin/uy/klutter/reflect/full/Types.kt –