Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin委托对象映射_Kotlin - Fatal编程技术网

Kotlin委托对象映射

Kotlin委托对象映射,kotlin,Kotlin,我正在尝试创建一个映射到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 inputBo

我正在尝试创建一个映射到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
    }
  }
}
有什么好方法可以解决这个问题吗?

以下内容未经测试(因为您没有提供示例
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
    }
  }
}
导入kotlin.reflect*
导入kotlin.reflect.jvm*
类CreatorMap(val映射:映射){
运算符fun getValue(thisRef:Any?,property:KProperty)=property.returnType.jvmErasure.constructors.first()。调用(map[property.name]作为map)作为T
}
类注册表ThingPostBody(inputBody:Map){
val设备:由CreatorMap(inputBody)创建的设备
val thing:thing by CreatorMap(inputBody)
类设备(inputBody:Map){
val serialnumber:按inputBody显示的字符串
val securityCode:按inputBody显示的字符串
}
类对象(inputBody:Map){
val名称:按inputBody显示的字符串
val位置:CreatorMap(inputBody)的位置
类位置(inputBody:Map){
val street:按inputBody输入的字符串
val city:按inputBody输入的字符串
val状态:按inputBody显示的字符串
val lat:由inputBody加倍
val-lon:通过输入体加倍
}
}
}
以下内容未经测试(因为您没有提供示例
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
    }
  }
}
导入kotlin.reflect*
导入kotlin.reflect.jvm*
类CreatorMap(val映射:映射){
运算符fun getValue(thisRef:Any?,property:KProperty)=property.returnType.jvmErasure.constructors.first()。调用(map[property.name]作为map)作为T
}
类注册表ThingPostBody(inputBody:Map){
val设备:由CreatorMap(inputBody)创建的设备
val thing:thing by CreatorMap(inputBody)
类设备(inputBody:Map){
val serialnumber:按inputBody显示的字符串
val securityCode:按inputBody显示的字符串
}
类对象(inputBody:Map){
val名称:按inputBody显示的字符串
val位置:CreatorMap(inputBody)的位置
类位置(inputBody:Map){
val street:按inputBody输入的字符串
val city:按inputBody输入的字符串
val状态:按inputBody显示的字符串
val lat:由inputBody加倍
val-lon:通过输入体加倍
}
}
}

我喜欢这样,我做的一个更改是在
CreatorMap
的构造函数中引入
kClass
,如下所示:
类对象映射(val-map:map,val-kClass:kClass)
。然后定义如下:
valdevicebyobjectmap(inputBody,device::class)
,但基本相同。。谢谢我喜欢这样,我做的一个更改是在
CreatorMapWrap
的构造函数中引入
kClass
,如下所示:
类对象映射(val-map:map,val-kClass:kClass)
。然后定义如下:
valdevicebyobjectmap(inputBody,device::class)
,但基本相同。。谢谢