Skip to content

Instantly share code, notes, and snippets.

@maxd
Created March 8, 2016 10:46
Show Gist options
  • Save maxd/8f967002343865dd40a7 to your computer and use it in GitHub Desktop.
Save maxd/8f967002343865dd40a7 to your computer and use it in GitHub Desktop.
import kotlin.reflect.KClass
inline operator fun <reified L : Any, reified R : Any> KClass<L>.compareTo(other: KClass<R>): Int {
return if (this === other) {
0
} else if (this.java.isAssignableFrom(other.java)) {
-1
} else if (other.java.isAssignableFrom(this.java)) {
1
} else {
throw IllegalArgumentException("Classes doesn't have common hierarchy.")
}
}
open class A {}
open class B: A() {}
open class C: B() {}
object Main {
@JvmStatic
fun main(vararg args: String) {
println(A::class < B::class)
println(A::class <= B::class)
println(A::class == B::class)
println(A::class >= B::class)
println(A::class > B::class)
println(A::class < A::class)
println(A::class > A::class)
println(B::class <= B::class)
println(B::class >= B::class)
}
}
@cypressious
Copy link

Here's a shorter version that doesn't use generics and reference equality:

operator fun KClass<*>.compareTo(other: KClass<*>) = when {
    this == other -> 0
    this.java.isAssignableFrom(other.java) -> -1
    other.java.isAssignableFrom(this.java) -> 1
    else -> throw IllegalArgumentException("Classes doesn't have common hierarchy.")
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment