我正在尝试编写一种方法,用于比较Kotlin中两个对象的“通用属性”(共享相同的名称/类型)。它旨在用于测试中,以比较“ 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”下收到此错误消息:
投影类型
KProperty1<out Any, Any?>
禁止使用public abstract fun get(receiver: T): R defined in kotlin.reflect.KProperty1
我知道我显然不能使用抽象方法,应该怎么做?
答案 0 :(得分:1)
您需要使用obj1::class.memberProperties
来代替SomeClass::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
的类标记,而不是其可能的派生类之一,因此它是{{1} }没有预测类型。