与可比较的平台声明冲突

时间:2016-10-18 06:44:21

标签: kotlin kotlin-interop

我从Comparable接口的多个默认实现产生了编译器的Platform Declaration Clash错误(如下所示)。

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的两个默认实现都映射到Java中的compareTo(Object)。因此,在孩子身上,Kotlin不知道使用哪一个。

是否有一种机制可以让我选择要使用的机制,或者更好的是,让我覆盖compareTo(Object)?我尝试过定义compareTo(Any),但那不对。另一篇帖子建议使用@JvmName,但注释在这里不适用(根据编译器)。

非常感谢任何帮助。谢谢!

1 个答案:

答案 0 :(得分:4)

你要么必须摆脱其中一个可比对象,要么你可以使用构图。这取决于你的用例。

以下是作文的例子。

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")
    }
}