Должен ли оператор `is` в выражении` when` видеть «закодированный» тип? - PullRequest
0 голосов
/ 12 февраля 2020

Пример кода:

class IsTesting(val myProperty: Int) {
    override fun equals(other: Any?): Boolean = when(other) {
        is IsTesting -> this.myProperty == other.myProperty
        else -> false
    }
}

fun main() {
    val a = IsTesting(42)
    val b = IsTesting(42)
    if (a == b)
        println("equal")
    else
        println("not equal")
}

Я не фанат жестко задавать имя класса там, но kotlin не позволит мне сделать

        is this::class -> this.myProperty == other.myProperty

Я вижу это ошибка:

Error:(3, 12) Kotlin: Type expected

Есть ли обходной путь, или я застрял?

1 Ответ

1 голос
/ 12 февраля 2020

Вы не можете использовать is this::class, потому что вы сравниваете его с other, который является Any?. В любом случае это не будет полезным сравнением, потому что this::class - это KClass<IsTesting>, а не IsTesting.

. Вы хотите сравнить other::class с this::class с проверкой равенства, а не с is проверка. Но сначала вы должны проверить, является ли other нулем, или вы не можете получить его класс. Но также умное приведение не может вывести из ::class сравнения тип other, поэтому вы также должны проверить это.

override fun equals(other: Any?): Boolean {
    other ?: return false
    if (other !is IsTesting)
        return false
    return when(other::class) {
        this::class -> this.myProperty == other.myProperty
        else -> false
    }
}

Ваш пример кода подходит только для финального класса. Для открытого класса он будет соответствовать подклассам, которые могут иметь дополнительные свойства.

Также рассмотрим data class, который не требует написания equals функции.

Я не Я думаю, что есть какой-то способ избежать жесткого кодирования имени класса где-то здесь, потому что other приходит как Any, и вы должны привести его к IsTesting, чтобы иметь доступ к его свойству.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...