在Kotlin中等于超载

时间:2016-04-07 15:53:33

标签: kotlin

我试图为我的班级重载compareToequals运算符。

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

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

编辑:如何正确地重载'=='?

2 个答案:

答案 0 :(得分:3)

根据this issue,在没有明确超类型的equals声明中,定义hashCodeobject被认为是无用的。在equals上执行hashCode + object个实例可能很少有用例。

即使是IDE检查,当您尝试这样做时也会显示警告:

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

但是,我不认为某些技术原因会阻止Kotlin解决重载操作符,整个行为很奇怪,所以我在Kotlin问题跟踪器中提交了an issue

就目前而言(Kotlin 1.0.2 EAP),即使使用声明的超类型,您也只能检查object完全相同声明的实例的相等性输入作为超类型:

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

至于将equals定义为扩展功能:不,您不能这样做,因为 extensions are resolved statically 并被成员遮蔽(有&#39; sa类似question about toString)。

答案 1 :(得分:-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
                 }
      }
}