Отображение объекта делегата Kotlin - PullRequest
0 голосов
/ 20 января 2019

Я пытаюсь создать карту в класс kotlin следующим образом:

class RegisterThingPostBody(inputBody: Map<String, Any>) {
  val device: Device by inputBody
  val thing: Thing by inputBody

  class Device(inputBody: Map<String, Any>) {
    val serialnumber: String by inputBody
    val securityCode : String by inputBody
  }

  class Thing(inputBody: Map<String, Any>) {
    val name: String by inputBody
    val location: Location by inputBody

    class Location(inputBody: Map<String, Any>) {
        val street: String by inputBody
        val city: String by inputBody
        val state: String by inputBody
        val lat: Double by inputBody
        val lon: Double by inputBody
    }
  }
}

Но я получаю ClassCastException для объектов (Thing, Device Location), что понятно.Я могу решить это, выполнив то, что я делаю ниже, но он не такой аккуратный, как верхний.И я должен повторить имя переменной дважды.

class RegisterThingPostBody(inputBody: Map<String, Any>) {
  val device = Device(inputBody["device"] as Map<String, Any>)
  val thing = Thing(inputBody["thing"] as Map<String, Any>)

  class Device(inputBody: Map<String, Any>) {
    val serialnumber: String by inputBody
    val securityCode : String by inputBody
  }

  class Thing(inputBody: Map<String, Any>) {
    val name: String by inputBody
    val location = Location(inputBody["location"] as Map<String, Any>)

    class Location(inputBody: Map<String, Any>) {
        val street: String by inputBody
        val city: String by inputBody
        val state: String by inputBody
        val lat: Double by inputBody
        val lon: Double by inputBody
    }
  }
}

Есть ли хороший способ решить эту проблему?

1 Ответ

0 голосов
/ 20 января 2019

Следующее не проверено (поскольку вы не предоставили полный пример с примером inputBody) и делает некоторые предположения относительно конструкторов:

import kotlin.reflect.*
import kotlin.reflect.jvm.*

class CreatorMapWrap<T: Any>(val map: Map<String, Any>) {
    operator fun getValue(thisRef: Any?, property: KProperty<*>) = property.returnType.jvmErasure.constructors.first().call(map[property.name] as Map<String, Any>) as T
}


class RegisterThingPostBody(inputBody: Map<String, Any>) {
  val device: Device by CreatorMapWrap(inputBody)
  val thing: Thing by CreatorMapWrap(inputBody)

  class Device(inputBody: Map<String, Any>) {
    val serialnumber: String by inputBody
    val securityCode : String by inputBody
  }

  class Thing(inputBody: Map<String, Any>) {
    val name: String by inputBody
    val location: Location by CreatorMapWrap(inputBody)

    class Location(inputBody: Map<String, Any>) {
        val street: String by inputBody
        val city: String by inputBody
        val state: String by inputBody
        val lat: Double by inputBody
        val lon: Double by inputBody
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...