如何比较类和接口?

Max*_*kov 12 kotlin

任何人都可以解释一下如何比较KClasse-s和你们之间的接口吗?我知道如何检查类或接口是否相等,但我不明白如何检查A类是否是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") }
}
Run Code Online (Sandbox Code Playgroud)

Vla*_*nov 11

Kotlin反射没有用于检索有关KClass层次结构的信息的API ,因此检查一个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") }
}
Run Code Online (Sandbox Code Playgroud)

更新: 您还可以定义两个扩展函数,使这种检查更好一点:

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") }
}
Run Code Online (Sandbox Code Playgroud)

  • @maxd stdlib 永远不会有这样的运算符,因为不可能为“KClass”正确实现“compareTo”。您的实现违反了“compareTo”合同,因为它永远不应该抛出。 (2认同)
  • 有扩展:[isSuperclassOf](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.reflect.full/is-superclass-of.html) [isSubclassOf](https://kotlinlang.org/ api/latest/jvm/stdlib/kotlin.reflect.full/is-subclass-of.html)。所以没有必要定义你自己的。确保包含 `kotlin-reflect` 库 (2认同)