Kotlin Comparable和operator compareTo之间有什么区别?

Kotlin Comparable和operator compareTo之间有什么区别?,kotlin,comparable,extension-function,Kotlin,Comparable,Extension Function,假设我有A类(val-foo:Double) 我希望能够将它与其他A、Double和Int进行比较 如果我实现了Comparable,我只能将其与另一种对象类型进行比较 override fun compareTo(other: A): Int { return when { this.foo == other.foo -> 0 this.foo > other.foo -> 1 else

假设我有
A类(val-foo:Double)

我希望能够将它与其他
A
Double
Int
进行比较

如果我实现了
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
    }
}

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

可比较的接口来自Java,并且正如您所看到的,仅使用compareTo(其他)方法定义,该方法仅提供将一个对象与同一类型的另一个对象进行比较的功能

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

因此,是的,如果要将对象与不同类型的对象进行比较,则需要编写适当的扩展函数


当然,在Java中,如果您可以控制类的源代码,则始终可以添加自定义的compareTo方法。

如果您创建自己的对象,则必须实现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
   }

}
class MyClass:可比{
重写fun compareTo(其他:MyClass):Int{
//如果此对象等于指定的其他对象,则TODO返回零
}
}
您还可以重写运算符函数,例如从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
   }
}
fun main(args:Array){
val a=1
val b=“2”
println(a.与(b)相比)
}
运算符fun Int.compareTo(i:String):Int{
返回if(this.toString()==i){
0
}否则{
1.
}
}

我希望这能对您有所帮助

Compariable
是一个标准接口,它是您定义类具有某种排序的方式,每个处理排序的库都使用
Compariable
类型。基本上,如果您希望能够使用所有标准函数和任何其他人可能编写的东西对您的东西进行排序和比较,则需要实现
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}")
}

只是一个强制实现上述运算符函数的接口当然,您可以使用扩展函数从对象生成自己的compareTo()函数,而不实现可比较的接口!
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}")
}