2016-03-07 10 views
9

KClasse-sとインターフェイス間の比較方法は誰にでも分かりますか?私は、クラスやインタフェースが同じであることを確認する方法を知られているが、私は、クラスは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 is implement IC interface") } 
    if (IC ??? IB) { println("IC interface is implement IB interface") } 
} 
+1

Klutterライブラリはまた、あなたがKotlinの反射で発生する可能性 'Class'と' KClass'のこれらの比較のためだけでなく、 'type'がと' KType'への拡張を持っています。 https://github.com/kohesive/klutter/blob/master/reflect-core-jdk6/src/main/kotlin/uy/klutter/reflect/Types.ktなどhttps://github.com/kohesive/ klutter/blob/master/reflection-full-jdk6/src/main/kotlin/uy/klutter/reflect/full/Types.kt –

答えて

8

Kotlinの反射に関する情報を取得するためのAPIを持っていませんどのように理解していませんKClass階層、1 KClassがスーパークラスまたは別のKClassのサブクラスであるかどうかを確認するための唯一の方法は、Javaクラスを対応する比較することですので:あなたはまた、MAKます2つの拡張機能を定義することができ :

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電子小切手のこの種のは少しよりよい:

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

うわー、私はcompareTo演算子がオーバーロードされることを期待しています – voddan

+0

@voddanできません部分的に順序付けられたセットのための 'compareTo'演算子を定義してください。 –

+1

@VladimirMironov @voddanは[this](https://gist.github.com/maxd/8f967002343865dd40a7)のようなものだと思います。 'compareTo'をオーバーライドし、比較クラスのために' <', '> '、' <=', '> = '演算子(例えば、Rubyで使用するそのような構文)を使用することが可能です。私はkotlin.reflectが将来このようなことをすることを願っています。 –