等于Kotlin中的重载
我试图为我的类重载等于Kotlin中的重载,kotlin,Kotlin,我试图为我的类重载compareTo和equals运算符 比较运算符没有问题。它既可以作为成员,也可以作为扩展函数 equals运算符必须是成员并重写equals fun class MyClass { companion object { private val NUMBER: Int = 5 operator fun compareTo(value: Int) = NUMBER - value override operator f
compareTo
和equals
运算符
比较运算符没有问题。它既可以作为成员,也可以作为扩展函数
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) {
}
}
class-MyClass{
伴星{
专用val编号:Int=5
运算符fun compareTo(值:Int)=数字-值
覆盖运算符乐趣等于(其他:有吗?)=
何时(其他){
是Int->NUMBER==其他
else->抛出异常(“”)
}
}
}
趣味测试(){
如果(MyClass<10){
//嗯
}
//运算符“==”不能应用于“MyClass.companion”和kotlin.Int
如果(MyClass==5){
}
}
编辑:如何正确重载“==”?根据,定义
等于和hashCode
对于没有显式超类型的对象
声明有些无用。可能正确的equals
+hashCode
对象上的实现几乎没有用例
甚至还有一个IDE检查,当您尝试这样做时会显示警告:
当对象具有声明的超类型时,警告不存在
然而,我不认为有什么技术原因阻止Kotlin解决重载操作符,而且整个行为都很奇怪,所以我向Kotlin issue tracker提交了文件
就目前而言(Kotlin 1.0.2 EAP),即使使用声明的超类型,您也只能检查对象与声明的类型(作为超类型)的实例是否相等:
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
objectsomeobject:List by listOf(){…}
SomeObject==listOf(1,2,3)//确定
SomeObject==arrayListOf(1,2,3)//未解析(为什么?)
对象MyObject:Any(){…}
MyObject==1//错误
MyObject==1,如有//OK o_o
对象另一个对象{…}
另一个对象==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
}
}
}
我不明白你为什么想要这个。正确实现的equals
方法对于伴随对象总是返回false
,除非与自身进行比较(这是默认/继承的行为)。