将对象转换为特定类取决于何时调用

时间:2019-05-15 16:38:38

标签: android kotlin types

我有一个类,其中一个属性可以具有2种不同的类型,如何将变量转换为我想要的那些类之一?

    class myObject{
        var type: Int
        var meta: Any? = null }

   var myobject:myObject=myObject()
        if(myobjetc.type ==1){
val myObject = (myobjetc.meta) as ObjectA
 Log.e("log",myObject.name)
}
        if(myobjetc.type ==2){
val myObject = (myobjetc.meta) as ObjectB
 Log.e("log",myObject.number)
}

问题在于它无法投射。

已编辑

class ObjectB: GsonBaseModel() {
var name: String? = null
}

    class ObjectA: GsonBaseModel() {
var number: Int? = null
}

2 个答案:

答案 0 :(得分:1)

您快到了。检查是否为空,或者使用iswhen and is

// as:
if(myobject.meta as ObjectA != null) Log.e("log", myobject.meta.name)
if(myobject.meta as ObjectB != null) Log.e("log", myobject.meta.number)

// is:
val meta = myobject.meta
if (meta is ObjectA) Log.e("log", meta.somePropertyOfObjectA)
if (meta is ObjectB) Log.e("log", meta.somePropertyOfObjectB)

// when:
when (myobject.meta) {
    is ObjectA -> Log.e("log", myobject.meta.name)
    is ObjectB -> Log.e("log", myobject.meta.number)
    else -> throw Exception()
}

但是,这仅在原始类型有意义的情况下有效。如果meta是ObjectC类的,而ObjectA和ObjectB都不从它继承,那么它将无济于事。但是,如果看不到您的课程代码,我们将无法为您提供帮助。

但是,在这种情况下,如果上述方法对您不起作用,则可能需要重新访问类设计或代码流。

编辑:将班级信息添加到“问题”中后,您似乎想使用第一个选项,即unsafe cast通过as并带有空检查。

答案 1 :(得分:0)

看起来您需要的是密封类

sealed class Model() : GsonBaseModel()

class TypeA(val number: Int?) : Model()
class TypeB(val name: String?) : Model()

when (myObject) {
    is TypeA -> log(myObject.number)
    is TypeB -> log(myObject.name)
}