0

可以说我有class A(val foo: Double)

我希望能够将它与其他A,DoubleInt.

如果我实现Comparable,我只能将它与另一种对象类型进行比较。

override fun compareTo(other: A): Int {
        return when {
            this.foo == other.foo -> 0
            this.foo > other.foo -> 1
            else -> -1
        }
    }

但我也看到了覆盖compareTo操作符的扩展函数。

operator fun A.compareTo(d: Double): Int {
    return when {
        this.foo == d -> 0
        this.foo > d -> 1
        else -> -1
    }
}

这些和我应该使用什么之间有什么区别?我猜如果我想将它与多种类型进行比较,那么我必须使用扩展函数吗?

4

3 回答 3

1

Comparable 接口来自 Java,并且如您所见,仅使用 compareTo(other) 方法定义,该方法仅用于将对象与相同类型的另一个对象进行比较。

正如您还注意到的,Kotlin 扩展函数是附加函数,允许您将对象与您想要的任何对象进行比较,只要您定义 compareTo 方法以获取您想要比较的类型的参数。

所以,是的,如果你想将一个对象与不同类型的对象进行比较,你需要编写一个适当的扩展函数。

当然,在 Java 中,如果你对类的源代码有控制权,你总是可以添加一个自定义的 compareTo 方法。

于 2020-12-17T22:49:58.860 回答
0

Wenn,您制作自己的对象,您必须实现 Comparable 接口,然后覆盖 compareTo 函数

class MyClass : Comparable<MyClass> {

   override fun compareTo(other: MyClass): Int {
      // TODO Returns zero if this object is equal to the specified other object
   }

}

您还可以覆盖运算符函数,例如来自 kotlin 中的 Int 类

fun main(args: Array<String>) {
   val a = 1
   val b = "2"
   println(a.compareTo(b))
}

operator fun Int.compareTo(i: String) : Int {
   return if (this.toString() == i) {
      0
   } else {
      1
   }
}

我希望这对你有帮助

于 2020-12-17T22:57:58.673 回答
0

Comparable是一个标准接口,它是您将类定义为具有某种排序的方式,并且每个处理排序的库都适用于Comparable类型。基本上,如果您希望能够使用所有标准函数以及任何其他人可能编写的任何东西来订购和比较您的东西,您需要实现Comparable接口。

这有效:

data class SportsTeam(val name: String) : Comparable<SportsTeam> {
    override fun compareTo(other: SportsTeam): Int = when {
        name == "best team" -> 1
        other.name == "best team" -> -1
        else -> 0
    }
}

fun main(args: Array<String>) {
    val best = SportsTeam("best team")
    val worst = SportsTeam("worst team")
    print("The winner is: ${maxOf(best, worst).name}")
}

但是因为maxOf需要一个Comparable类型,所以这不起作用:

data class SportsTeam(val name: String)

fun SportsTeam.compareTo(other: SportsTeam): Int = when {
    name == "best team" -> 1
    other.name == "best team" -> -1
    else -> 0
}

fun main(args: Array<String>) {
    val best = SportsTeam("best team")
    val worst = SportsTeam("worst team")
    print("The winner is: ${maxOf(best, worst).name}")
}
于 2020-12-18T09:33:07.210 回答