Я не уверен в причине этой ошибки, но она может быть связана с более глубокой проблемой с вашим подходом…
В Kotlin (и Java) метод equals()
имеет довольно узкуюСпецификация.Одно условие состоит в том, что он должен быть симметричным: всякий раз, когда a
и b
не равны нулю, a.equals(b)
всегда должен давать тот же результат, что и b.equals(a)
.
Но ваша реализация не проходит этот тест, потому что CS("abc").equals("abc")
возвращает true
, а "abc".equals(CS("ABC"))
равно false
.Это потому, что ваш класс знает о CharSequence
s, таких как String
, но String
не знает о вашем классе.
Нет простого способа обойти это.В целом, гораздо безопаснее разрешить экземплярам класса соответствовать только экземплярам этого класса.Если вы контролируете оба класса, то есть способы обойти это, но они довольно тонкие и запутанные.(Возможно, лучшим объяснением является Martin Odersky et al. .)
Так что большинство реализаций equals()
имеют тенденцию работать по следующим направлениям:
override fun equals(other: Any?)
= (other is ThisClass)
&& field1 == other.field1
&& field2 == other.field2
// ...
Как ясказал, я не знаю, почему компилятор Kotlin жалуется в вашем случае.Может быть, он обнаружил что-то из этой проблемы, или это может быть что-то не связанное.Но я не думаю, что вы сможете исправить свою программу таким образом, чтобы проверки на равенство делали то, что вы хотите, поэтому, возможно, лучше принять это как подсказку, чтобы попробовать немного другой подход!