比较kotlin中对象的公共属性的值

Compare values of common properties of objects in kotlin

我正在尝试编写一种方法来比较 Kotlin 中两个对象的 'common properties'(共享相同的 name/type)。它旨在用于测试,用于比较 'expected' 与 'actual' 不同类型的对象。

到目前为止,这是代码的简化版本:

val obj1Props = obj1::class.memberProperties
val obj2Props = obj2::class.memberProperties

val commonPropertyPairs  = obj1Props.map { obj1Prop ->
        obj1Prop to obj2Props.find { obj2Prop -> obj1Prop.name == obj2Prop.name } }
    .filter { pair -> pair.second != null }

commonPropertyPairs.forEach { pair ->
  pair.first.get(obj1)
}

我目前在 'pair.first.get' 底部附近收到此错误消息:

out-projected type KProperty1<out Any, Any?> prohibits the use of public abstract fun get(receiver: T): R defined in kotlin.reflect.KProperty1

我知道我显然不能使用抽象方法,我应该怎么做?

您需要使用 SomeClass::class.memberProperties 而不是 obj1::class.memberProperties,例如:

override fun buildNavItem() {
    val obj1 = "Hello"
    val obj2 = 10
    val obj1Props = String::class.memberProperties
    val obj2Props = Int::class.memberProperties

    val commonPropertyPairs  = obj1Props.map { obj1Prop ->
        obj1Prop to obj2Props.find { obj2Prop -> obj1Prop.name == obj2Prop.name } }
            .filter { pair -> pair.second == null }

    commonPropertyPairs.forEach { pair ->
        pair.first.get(obj1)
    }
}

造成这种差异的原因是,当使用 SomeClass::class 引用时,它必然是代表 SomeClass 的 class 标记,而不是其可能派生的 [=20] =]是的,所以它KClass<SomeClass>没有预测类型。