我有一个类,其中一个属性可以具有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
}
答案 0 :(得分:1)
您快到了。检查是否为空,或者使用is
或when
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)
}