2016-03-07 20 views
9

Kimse bana KClasse-s ve arayüzleri kendi aralarında nasıl karşılaştırılabileceğini açıklayabilir mi? Ben sınıfları veya arabirimleri eşit olduğunu nasıl kontrol edileceğini bilinen ama, A sınıfı B sınıfı üst sınıf olup olmadığını kontrol etmek vbSınıflar ve arayüzler nasıl karşılaştırılır?

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

Klutter kütüphanesi ayrıca Kotlin yansıma ile karşılaşabileceğiniz Class' ve 'KClass',' bu karşılaştırmalar için uzantıları yanı sıra Type' ve 'KType'' zorundadır . https://github.com/kohesive/klutter/blob/master/reflect-core-jdk6/src/main/kotlin/uy/klutter/reflect/Types.kt ve daha fazlası https://github.com/kohesive/ klutter/blob/master/yansıtır-tam-jdk6/src/ana/kotlin/uy/klutter/yansıtır/tam/Types.kt –

cevap

8

Kotlin yansıma hakkında bilgi almak için bir API yok anlamıyorum bir KClass üst sınıf veya başka KClass alt sınıfı tekabül java sınıfları karşılaştırmak ise KClass hiyerarşi, yani tek yol kontrol etmek:

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

GÜNCELLEME: Ayrıca mak olan iki uzatma fonksiyonlarını tanımlayabilir e biraz daha güzel çeklerin bu tür:

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

vay, ben 'compareTo' operatörünün – voddan

+0

@voddan için aşırı yüklenmesini beklerim Kısmen sipariş setleri için bir "compareTo" operatörü tanımlayın –

+1

@ VladimirMironov Bence @voddan [bu] gibi bir şey ifade eder (https://gist.github.com/maxd/8f967002343865dd40a7). 'CompareTo' işlevini geçersiz kılmak ve '<', '>', '<=', '> =' sınıflarını karşılaştırmak için kullanabileceğinizleri görebildiğiniz gibi (örneğin Ruby'de böyle bir sözdizimi). Umarım kotlin.reflect gelecekte böyle bir şeye sahip olur. –

İlgili konular