等于在Kotlin超载

我正在尝试为我的类重载compareToequals运算符。

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

等号运算符必须是成员,重写等于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) { } } 

编辑:如何正确超载’==’?

根据这个问题 ,定义equalshashCode在没有显式超types的object声明上被认为是无用的。 大概正确的equals + objecthashCode实现几乎没有用例。

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

IDE警告截图
当对象有一个声明的超types时,警告不存在。

但是,我不认为有一些技术上的原因阻止了Kotlin解决超载运算符的问题,整个行为都是奇怪的,于是我在Kotlin问题跟踪器中提出了一个问题 。

至于现在(Kotlin 1.0.2 EAP),甚至在声明超types的情况下,你也只能检查object与具有超types的声明types完全相同的实例的相等性:

 object SomeObject : List 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扩展function:不,你不能这样做,因为扩展是静态解析 ,并由成员(有toString类似的问题 )的影子。