У меня есть следующий класс, который служит базой для нескольких других классов:
abstract class BaseFitness: Comparable<BaseFitness> {
var valid: Boolean = false
fun invalidate() { valid = false }
abstract fun value(): Double
abstract fun copy(): BaseFitness
override operator fun equals(other: Any?): Boolean =
if (other is BaseFitness)
this.value() == other.value()
else
throw IllegalArgumentException("Can only compare to another class derived from BaseFitness.")
override fun compareTo(other: BaseFitness): Int =
this.value().minus(other.value())
.let { if (it.isNaN()) 0.0 else it }
.sign.toInt()
@JvmName("compareToOperator")
operator fun compareTo(other: Any?): Int =
if (other is BaseFitness)
this.compareTo(other)
else
throw IllegalArgumentException("Can only compare to another class derived from BaseFitness.")
}
Теперь в этом классе я хочу реализовать базовое c поведение сравнения.
В основном Я хочу иметь возможность:
if (fit1 == fit2) { /* do stuff */ }
if (fit1 > fit2) { /* do stuff */ }
if (fit1 < fit2) { /* do stuff */ }
myFitnessSequence.max()
Функции оператора equals()
и compareTo()
заботятся о первых 3 элементах. Однако для последнего пункта мне нужно BaseFitness
для реализации Comparable
. Проблема в том, что когда я реализую сопоставимый и добавляю неоператорный метод compareTo()
, то каким-то образом equals()
разрывается с этим сообщением:
'operator' modifier is inapplicable on this function: must override ''equals()'' in Any
Я пытался сделать то же самое, что и с compareTo()
, просто 2 реализации equals()
, одна помечена как оператор, а другая оставлена как метод и добавляет @JvmName
к одной из них, и я получаю
'@JvmName' annotation is not applicable to this declaration
Прямо сейчас мои варианты в основном либо выбрать сохранить и ==
оператор, но не реализующий Comparable
или отказ от ==
для использования сопоставимого.