在Kotlin中如何检查对象是基类还是派生类的实例

时间:2019-03-16 15:46:25

标签: inheritance kotlin

具有基类和派生类(在此简化)

open class BaseClass {
    var baseData: BaseData? = null
}
open class DerivedClass : BaseClass {
    var drivedData: DerivedData? = null
}

还有一个用于BaseClass的数组

val list = ArrayList<BaseClass>()
// populated the list with mixed objects of BaseClass and DerivedClass

for (obj in list) {
    when (obj){
        is DerivedClass -> {}
        is BaseClass -> {}
    }
}

这可能有用,因为它首先检查了是否为DerivedClass,然后针对BaseClass进行了检查。

是否有更好的方法而不利用检查的顺序?

1 个答案:

答案 0 :(得分:1)

val list = ArrayList<BaseClass>()

for (obj in list) {
    when(obj.javaClass.name) {
        BaseClass.clazz() -> { println("is base !") }
        DerivedClass.clazz() ->  { println("is derived !") }
    }
}

使用:

open class BaseClass {
    companion object {
        fun clazz() = "BaseClass"
    }
}

open class DerivedClass : BaseClass() {
    companion object {
        fun clazz() = "DerivedClass"
    }
}

我知道那不是很好,我们必须处理其他方法clazz(),并且我们没有使用is运算符,但至少它回答了以下问题: is有一种方法不使用检查的顺序:)