Сравните значения общих свойств объектов в котлине - PullRequest
0 голосов
/ 28 декабря 2018

Я пытаюсь написать метод, который будет сравнивать «общие свойства» (разделяющие одно и то же имя / тип) двух объектов в Kotlin.Он предназначен для использования в тестах, для сравнения «ожидаемых» с «фактическими» объектами, которые не относятся к одному и тому же типу.

На данный момент это упрощенная версия кода:

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

Я понимаю, что не могу использовать абстрактные методы, что мне делать вместо этого?

1 Ответ

0 голосов
/ 28 декабря 2018

Вместо 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, а не один из его возможных производных классов, поэтому он KClass<SomeClass> без типов прогнозирования.

...