Kotlin 将泛型 Class 转换为地图

Kotlin Convert Genertic Class to Map

有个A Data Class

data class A(val x: String?, val y: Int?)

我必须一二,如果 one 中有空值,则将其替换为 two 的 属性 值,但如果不为空,则保留 one的价值

val one = A(null, 3) 
val two = A("11", 4)

A("11", 3)

我想到的想法是将两个A对象转换为Map,然后合并两个Map 然后将合并的 Map 反序列化为 A

我的问题是

  1. 合并两个对象有什么好主意吗?(我的情况)
  2. 如何将通用 Class 转换为地图
inline fun <reified T> toJsonObject(value: T): Map<String, Any> =
        objectMapper.readValue(objectMapper.writeValueAsString(value), Map::class.java)

这不起作用请帮助我..

这只有通过反射才有可能:

import kotlin.reflect.full.declaredMembers
   
inline fun <reified T> T.takeValuesIfNullFrom(item: T): T {
  if(this!!::class != item!!::class) return this
  val constructor = T::class.constructors.first()
  val parameterNames = constructor.parameters.map { parameter -> parameter.name }
  val arguments = T::class.declaredMembers
    .filter { it.name in parameterNames }
    .map { it.call(if (it.call(this) == null) item else this) }
  return constructor.call(*arguments.toTypedArray())
}

测试:

data class A(val x: String?, val y: Int?)

val one = A(null, 3)
val two = A("11", 4)

data class B(val x: String?, val y: Int?, val z: Float?)

val three = B(null, 5, null)
val four = B("22", 6, 123.456f)

val resultA = one.takeValuesIfNullFrom(two)
println(resultA)

val resultB = three.takeValuesIfNullFrom(four)
println(resultB)

输出:

A(x=11, y=3)
B(x=22, y=5, z=123.456)