如何比较类和接口? [英] How to compare classes and interfaces?
问题描述
有人可以向我解释一下如何比较KClasse和接口吗?我知道如何检查类或接口是否相等,但我不明白如何检查A类是否是B类的超类,等等.
Can anybody explain me how to compare KClasse-s and interfaces among yourselves? I known how to check that classes or interfaces are equal but I don't understand how to check that A class is superclass of B class, etc.
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") }
}
推荐答案
Kotlin反射没有API来检索有关KClass
层次结构的信息,因此检查一个KClass
是该类的超类还是子类的唯一方法另一个KClass
是比较对应的Java类:
Kotlin reflection doesn't have an API for retrieving information about KClass
hierarchy, so the only way to check if one KClass
is superclass or subclass of another KClass
is to compare corresponding java classes:
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: You can also define two extension functions that will make this kind of checks a bit nicer:
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") }
}
这篇关于如何比较类和接口?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!