Phản ánh Kotlin không có API để truy xuất thông tin về KClass
hệ thống phân cấp, vì vậy cách duy nhất để kiểm tra xem một KClass
là lớp cha hoặc lớp con của KClass
khác là để so sánh các lớp java tương ứng:
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: Bạn cũng có thể xác định hai chức năng mở rộng mà sẽ mak e loại kiểm tra này đẹp hơn một chút:
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") }
}
Nguồn
2016-03-07 19:37:25
Thư viện Klutter cũng có phần mở rộng cho các so sánh này của 'Lớp' và' KClass', cũng như 'Loại' và' KType' mà bạn có thể gặp phải với phản ánh Kotlin . https://github.com/kohesive/klutter/blob/master/reflect-core-jdk6/src/main/kotlin/uy/klutter/reflect/Types.kt và các dịch vụ khác trong https://github.com/kohesive/ klutter/blob/master/reflect-full-jdk6/src/main/kotlin/uy/klutter/reflect/full/Types.kt –