繁体   English   中英

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

[英]cast an object into specific class depend on when called

我有一个类,其中一个属性可以具有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)
}

问题是它无法投射。

EDITED

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

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

你快到了。 检查是否为null,或者更好,使用iswhenis

// 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都不从它继承,那么它将无济于事。 但是,如果看不到您的课程代码,我们将无法为您提供帮助。

但是,在这种情况下,如果以上方法都不适合您,则可能需要重新访问类设计或代码流。

编辑:类信息添加到问题后,它看起来像你要第一个选项, 不安全投通过as一个空检查。

看起来您需要的是密封课程

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM