Столкновение декларации платформы с сопоставимым

Я получаю сообщение об ошибке декларации платформы от компилятора, возникающее в результате нескольких реализаций 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")
    }
}
Другие вопросы по тегам