Столкновение декларации платформы с сопоставимым
Я получаю сообщение об ошибке декларации платформы от компилятора, возникающее в результате нескольких реализаций Comparable интерфейсов по умолчанию (показано ниже).
interface ClassA: Comparable<ClassA>
{
val x: Int
get
override fun compareTo(other: ClassA): Int = this.x.compareTo(other.x)
}
interface ClassB: Comparable<ClassB>
{
val y: String
get
override fun compareTo(other: ClassB): = this.y.compareTo(other.t)
}
data class ClassAB(val x: Int, val y: String): ClassA, ClassB
{
...
}
Я понимаю, почему я получаю эту ошибку; обе реализации по умолчанию compareTo
сопоставить с compareTo(Object)
на Яве. Таким образом, у ребенка Котлин не знает, какой из них использовать.
Есть ли механизм, который позволит мне выбрать тот, который использовать, или, еще лучше, позвольте мне переопределить compareTo(Object)
? Я пытался определить compareTo(Any)
, но это было не правильно. Другая публикация предложила использовать @JvmName
, но аннотация здесь не применяется (согласно компилятору).
Любая помощь будет принята с благодарностью. Спасибо!
1 ответ
Либо вы должны избавиться от одного из этих сопоставимых, либо вы можете использовать композицию. Это зависит от вашего варианта использования.
Вот пример для композиции.
data class ClassAB(val x: Int, val y: String): Comparable<ClassAB>
{
val classA: ClassA
val classB: ClassB
override fun compareTo(other: ClassAB): Int {
// do compare
classA.compareTo(other.classA)
classB.compareTo(other.classB)
throw UnsupportedOperationException("not implemented")
}
}