我试图为我的班级重载compareTo
和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) {
}
}
编辑:如何正确地重载'=='?
答案 0 :(得分:3)
根据this issue,在没有明确超类型的equals
声明中,定义hashCode
和object
被认为是无用的。在equals
上执行hashCode
+ object
个实例可能很少有用例。
即使是IDE检查,当您尝试这样做时也会显示警告:
但是,我不认为某些技术原因会阻止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
}
}
}