Равная перегрузка в Котлине

Я пытался перегрузить compareTo и equals операторам для моего класса.

Нет проблем с оператором сравнения. Он хорошо работает как как член, так и как функция расширения.

Оператор equals должен быть членом, а переопределение равно весу.

 class MyClass { companion object { private val NUMBER: Int = 5 operator fun compareTo(value: Int) = NUMBER - value override operator fun equals(other: Any?) = when (other) { is Int -> NUMBER == other else -> throw Exception("") } } } fun test() { if (MyClass < 10) { //ok } //Operator '==' cannot be applied to 'MyClass.companion' and kotlin.Int if (MyClass == 5) { } } 

Изменить: как правильно перегрузить '=='?

Определение equals и hashCode считается несколько бесполезным в объявлениях object , которые не имеют явного супертипа, согласно этой проблеме . Вероятно, правильная реализация equals + hashCode на object имеет мало вариантов использования.

Существует даже проверка IDE, которая показывает предупреждение, когда вы пытаетесь сделать это:

Снимок экрана предупреждения IDE
Предупреждения не существует, когда объект имеет объявленный супертип.

Тем не менее, я не думаю, что какая-то техническая причина не позволяет Kotlin разрешить перегруженный оператор, и все поведение странно, поэтому я подал вопрос в трекер Kotlin.

На данный момент (Kotlin 1.0.2 EAP), даже с объявленным супертипом, вы можете проверить только равенство object с экземплярами точно такого же объявленного типа, который у него есть как супертип:

 object SomeObject : List<Int> by listOf() { ... } SomeObject == listOf(1, 2, 3) // OK SomeObject == arrayListOf(1, 2, 3) // not resolved (why?) object MyObject : Any() { ... } MyObject == 1 // error MyObject == 1 as Any // OK o_O object AnotherObject { ... } AnotherObject == 1 as Any // works! Probably Any is supertype here 

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

  • Котлинский эквивалент Optional.map и ссылка на метод
  • Проверка типов запустила рекурсивную в kotlin
  • Запуск тестов Kotlin Koans от Android Studio
  • Класс <?> Clazz в Котлине
  • Ожидается, что в Котлине ожидается активатор или сеттер
  • libgdx AssetManager preload ttf шрифт не работает
  • Как я могу создать проект Kotlin, который строится вместе с Gradle?
  • Тест JUnit в Котлине
  • Ссылка на набор свойств класса Kotlin как функция
  • Android - Сделать функцию ложной / не запускать
  • Возвращаемое значение для переменной, которая, по-видимому, может быть нулевой, но на самом деле не может
  • Давайте будем гением компьютера.