【问题标题】:How to compare classes and interfaces?如何比较类和接口?
【发布时间】:2021-03-10 00:06:29
【问题描述】:

谁能解释我如何比较KClasses 和它们之间的接口?我知道如何检查类或接口是否相等,但我不明白如何检查 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 implements IC interface") }
  if (IC ??? IB) { println("IC interface implements IB interface") }
}

【问题讨论】:

标签: kotlin reflection


【解决方案1】:

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 implements IC interface") }
  if (IB::class.java.isAssignableFrom(IC::class.java)) { println("IC interface implements IB interface") }
}

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

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 implements IC interface") }
  if (isSubClassOf<IC, IB>()) { println("IC interface implements IB interface") }
}

【讨论】:

  • 哇,我希望 compareTo 运算符会因此而被重载
  • @voddan 你不能为偏序集定义compareTo 运算符
  • @VladimirMironov 我认为@voddan 的意思类似于this。如您所见,可以覆盖compareTo 并使用&lt;&gt;&lt;=&gt;= 运算符进行比较类(例如在Ruby 中使用的此类语法)。我希望 kotlin.reflect 将来会有这样的东西。
  • @maxd stdlib 永远不会有这样的运算符,因为不可能为KClass 正确实现compareTo。你的实现违反了compareTo 契约,因为它不应该抛出。
  • 有扩展名:isSuperclassOfisSubclassOf。所以没有必要自己定义。确保包含 kotlin-reflect
猜你喜欢
  • 2020-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-14
  • 1970-01-01
  • 2016-02-14
相关资源
最近更新 更多