Предлагаемое изменение `equals` на` == `не может быть применено к Char и String? - PullRequest
3 голосов
/ 16 мая 2019

У меня есть функция, как показано ниже.

    fun process(string: String?): Int {
        if (string != null) {
            return string.filter { it.equals("a") }.length
        }
        return 0
    }

Это показывает, что it.equals("a") может быть улучшено, с сообщением Call replaceable with binary operator

Так что я просто использую Alt-Enter для измененияэто соответственно и получить

    fun process(string: String?): Int {
        if (string != null) {
            return string.filter { it == "a" }.length
        }
        return 0
    }

К сожалению, теперь это ошибка с указанием

Operator '==' cannot be applied to Char and String.

Я предполагаю, что это ошибка в предложенной оптимизации?

1 Ответ

5 голосов
/ 16 мая 2019

Просто чтобы убедиться, что мы на одной странице, it - это Char, потому что используемый вами метод filter работает со строкой как последовательность символов.

ОшибкаВы получаете это потому, что оператор == является более строгим, чем его аналог метода equals(), и требует соответствия типа.Поскольку "a" является строкой, вы не можете использовать оператор для сравнения ее с символом it.

Обратите внимание, что даже если компилируется версия с equals(), она бы не сработала, потому что строка никогда бы не равнялась никаким символам.По этой причине ребята из Kotlin сделали это ошибкой компиляции для оператора: больше безопасности типов.

Насколько я понял, они следовали соглашению Java для метода equals и оставили свой контракт разрешительным дляразрешив Any? в качестве параметра.Вероятно, это связано с ограничениями взаимодействия с Java.

Даже если операторы компилируются в эквивалентные вызовы методов, компилятор имеет дополнительные проверки в форме операторов по сравнению с явными вызовами методов.

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