enum сравнить с перегрузкой оператора со значением NULL - PullRequest
0 голосов
/ 24 ноября 2018

У меня есть перечисление SupportUsLevel, определенное в Kotlin.Его необработанный тип - строка (по другим причинам), но я включил значение numeric в качестве Int для облегчения сравнения.Я хочу сравнить это перечисление с другим перечислением, но это также может быть нулевым.Итак, я реализовал оператор сравнения, который принимает обнуляемое значение other:

enum class SupportUsLevel(val value: String) {

    red("red"),
    blue("blue"),
    black("black");

    val numeric: Int
        get() {
            when (this) {
                red -> return 1
                blue -> return 5
                black -> return 7
            }
        }

    //return 0 if equal, negative (-1) is smaller, positive(+1) is bigger
    operator fun SupportUsLevel.compareTo(other: SupportUsLevel?) : Int {
        //if other is null, since I cannot be null, I am always bigger
        if (other == null) {
            return 1
        }
        //return numeric comparison since we both now have a value (due to null-check before)
        return numeric.compareTo(other.numeric)
       }
}

Однако, когда я хочу его использовать, кажется, что это пользовательское сравнение не распознается компилятором?Я получаю несоответствие типов:

enter image description here

1 Ответ

0 голосов
/ 24 ноября 2018

Метод экземпляра всегда предпочтительнее, чем расширение (см. Комментарии JB Nizet в вопросе org), это означает, что компилятор никогда не распознает пользовательский метод CompareTo.

Лучшее решение, которое я смог найтисделать его стандартной функцией-членом (обратите внимание, что это уже не сравнение, а isHigherThen (...), поскольку это то, что мне нужно):

enum class SupportUsLevel(val value: String) {

    //since we are using the standard enum compare operator the order must be low to high!
    //refer to /11292269/enum-sravnit-s-peregruzkoi-operatora-so-znacheniem-null

    red("red"),
    blue("blue"),
    black("black");

    val numeric: Int
        get() {
            when (this) {
                red -> return 1
                blue -> return 5
                black -> return 7
            }
        }

    fun isHigherThen(other: SupportUsLevel?) : Boolean {
        //if other is null, since I cannot be null, I am always bigger
        if (other == null) { return true }
        //return numeric comparison since we both now have a value (due to null-check before)
        return numeric > other.numeric
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...