[英]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,或者更好,使用is
或when
和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都不从它继承,那么它将无济于事。 但是,如果看不到您的课程代码,我们将无法为您提供帮助。
但是,在这种情况下,如果以上方法都不适合您,则可能需要重新访问类设计或代码流。
编辑:类信息添加到问题后,它看起来像你要第一个选项, 不安全投通过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.