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

Я пытался перегрузить 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 ).

Intereting Posts
Возможно ли распространять список внутри списка в Котлине? Должны ли свойства класса в Котлине быть частными и как обращаться к ним? Kotlin весело возвращается преждевременно Компоненты архитектуры Android Room ViewModel CompleteableFormAction Простой калькулятор, модульное тестирование с использованием KOTLIN со Spek (код выхода -1) JaVers обнаруживает изменения в childs, если изменяется свойство simple в корневом объекте Gradle не находит мои тесты с Kotlin и JUnit 5 Intellij Idea не будет компилировать kotlin, но maven делает как загрузить конфигурацию в spring-webflux без весенней загрузки? Создание родового типа в Котлине Котлинский эквивалент тернарного оператора Как изменить карту в Котлине? единичный тест с штормом апачей и кассандра: локальная топология, не потребляющая сообщение от кафки Наследование Котлина с дженериками Борясь с попыткой получить изображение с камеры для загрузки в Firebase – java.lang.IllegalStateException: uri не должен быть нулевым