在Kotlin中等于超载

IvB*_*nov 7 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) {
    }
}
Run Code Online (Sandbox Code Playgroud)

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

hot*_*key 4

根据this Issue ,定义equalsand在没有显式超类型的声明hashCode中被认为有些无用。s 上的正确+实现可能很少有用例。objectequalshashCodeobject

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

IDE警告截图
当对象具有声明的超类型时,不会出现警告。

但是,我不认为某些技术原因会阻止 Kotlin 解决重载运算符,而且整个行为很奇怪,因此我在 Kotlin 问题跟踪器中提交了一个问题

就目前而言(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
Run Code Online (Sandbox Code Playgroud)

至于定义equals为扩展函数:不,你不能这样做,因为扩展是静态解析的并且被成员隐藏(有一个类似的问题toString)。