2016-03-07 23 views
9

Có ai có thể giải thích cho tôi cách so sánh KClasse-s và giao diện giữa bạn hay không? Tôi biết cách kiểm tra các lớp hoặc giao diện đó bằng nhau nhưng tôi không hiểu cách kiểm tra xem lớp A là lớp bậc trên của lớp B, v.v.Cách so sánh các lớp và giao diện?

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") } 
} 
+1

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 –

Trả lời

8

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") } 
} 
+1

wow, tôi mong đợi toán tử 'compareTo' bị quá tải cho – voddan

+0

@voddan bạn không thể xác định toán tử 'compareTo' cho các bộ đặt hàng một phần –

+1

@VladimirMironov Tôi nghĩ @voddan có nghĩa là cái gì đó như [this] (https://gist.github.com/maxd/8f967002343865dd40a7). Như bạn có thể thấy có thể ghi đè lên 'compareTo' và sử dụng' <', '> ',' <=', '> = 'toán tử cho các lớp so sánh (ví dụ như cú pháp sử dụng trong Ruby). Tôi hy vọng kotlin.reflect sẽ có một cái gì đó như thế này trong tương lai. –

Các vấn đề liên quan