等于Kotlin中的重载

等于Kotlin中的重载,kotlin,Kotlin,我试图为我的类重载compareTo和equals运算符 比较运算符没有问题。它既可以作为成员,也可以作为扩展函数 equals运算符必须是成员并重写equals fun class MyClass { companion object { private val NUMBER: Int = 5 operator fun compareTo(value: Int) = NUMBER - value override operator f

我试图为我的类重载
compareTo
equals
运算符

比较运算符没有问题。它既可以作为成员,也可以作为扩展函数

equals运算符必须是成员并重写equals fun

class MyClass {
    companion object {
        private val NUMBER: Int = 5

        operator fun compareTo(value: Int) = NUMBER - value

        override operator fun equals(other: Any?) =
                when (other) {
                    is Int -> NUMBER == other
                    else -> throw Exception("")
                }
    }
}

fun test() {
    if (MyClass < 10) {
        //ok
    }

    //Operator '==' cannot be applied to 'MyClass.companion' and kotlin.Int
    if (MyClass == 5) {
    }
}
class-MyClass{
伴星{
专用val编号:Int=5
运算符fun compareTo(值:Int)=数字-值
覆盖运算符乐趣等于(其他:有吗?)=
何时(其他){
是Int->NUMBER==其他
else->抛出异常(“”)
}
}
}
趣味测试(){
如果(MyClass<10){
//嗯
}
//运算符“==”不能应用于“MyClass.companion”和kotlin.Int
如果(MyClass==5){
}
}

编辑:如何正确重载“==”?

根据,定义
等于
hashCode
对于没有显式超类型的
对象
声明有些无用。可能正确的
equals
+
hashCode
对象上的
实现几乎没有用例

甚至还有一个IDE检查,当您尝试这样做时会显示警告:


当对象具有声明的超类型时,警告不存在

然而,我不认为有什么技术原因阻止Kotlin解决重载操作符,而且整个行为都很奇怪,所以我向Kotlin issue tracker提交了文件

就目前而言(Kotlin 1.0.2 EAP),即使使用声明的超类型,您也只能检查
对象与声明的类型(作为超类型)的实例是否相等:

object SomeObject : List<Int> by listOf() { ... }
SomeObject == listOf(1, 2, 3) // OK
SomeObject == arrayListOf(1, 2, 3) // not resolved (why?)

object MyObject : Any() { ... }
MyObject == 1 // error
MyObject == 1 as Any // OK o_O

object AnotherObject { ... }
AnotherObject == 1 as Any // works! Probably Any is supertype here
objectsomeobject:List by listOf(){…}
SomeObject==listOf(1,2,3)//确定
SomeObject==arrayListOf(1,2,3)//未解析(为什么?)
对象MyObject:Any(){…}
MyObject==1//错误
MyObject==1,如有//OK o_o
对象另一个对象{…}
另一个对象==1,因为任何//都有效!这里可能有超型

至于将
等于
定义为一个扩展函数:不,你不能这样做,因为和被成员跟踪(有类似的情况)。

我认为你的实现是正确的方法

考虑这一点:

class MyClass {
    companion object {
         private val NUMBER: Int = 5
         private val STRING: String = "foo"

         override fun equals(other: Any?): Boolean {
                  when(other){
                     is MyClass -> {
                        return this.NUMBER == other.NUMBER &&
                               this.STRING == other.STRING
                      }
                     else -> return false
                 }
      }
}

我不明白你为什么想要这个。正确实现的
equals
方法对于伴随对象总是返回
false
,除非与自身进行比较(这是默认/继承的行为)。