等于在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) { } } 

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

One Solution collect form web for “等于在Kotlin超载”

根据这个问题 ,定义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类似的问题 )的影子。

  • 对于使用Kotlin的方法,jmethodID为NULL
  • NPE构造函数和超类
  • 无法使用Android Gradle插件3.0.1解决assembleAndroidTest任务的依赖关系
  • 我的春季启动(Kotlin)控制器不工作,返回字符串
  • 在Kotlin安装和Getters
  • Kotlin:从Firebase获取数据
  • 属性getter在Supertype上输入,而不是在Kotlin中执行
  • 为什么可以在子types的重载成员函数中省略默认值?
  • 在@Transactional方法调用期间,初始化期间Bean属性不为null变为null
  • Kotlin:我如何传递一个谓词到CharSequence.any()函数?
  • Android中的与Kotlin的AsyncTask
  • Kotlin language will be the best programming language for Android.