приведение объекта в определенный класс зависит от того, когда вызывается - PullRequest
0 голосов
/ 15 мая 2019

У меня есть класс, в котором одно из свойств может иметь два разных типа. Как я могу привести эту переменную к одному из тех классов, которые мне нужны?

    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 ]

1 голос
/ 15 мая 2019

Ты почти у цели. Либо проверьте на ноль, либо еще лучше, используйте 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()
}

Однако, это работает, только если имеет смысл оригинальный тип. Если мета имеет класс ObjectC, и ни ObjectA, ни ObjectB не наследуют его, то это не поможет. Не видя ваш код класса, мы не сможем вам там помочь.

Но если это так, вы можете пересмотреть дизайн своего класса или поток кода, если вышеприведенное не сработает для вас.

РЕДАКТИРОВАТЬ: После того, как информация о классе была добавлена ​​в Вопрос, похоже, что вы захотите первый вариант, небезопасное приведение через as с нулевой проверкой.

0 голосов
/ 15 мая 2019

Похоже, вам нужен запечатанный класс

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)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...