我试图为我班级重载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) {
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:如何正确地重载'=='?
根据this Issue ,定义equals
and在没有显式超类型的声明hashCode
中被认为有些无用。s 上的正确+实现可能很少有用例。object
equals
hashCode
object
当您尝试这样做时,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
)。
归档时间: |
|
查看次数: |
3932 次 |
最近记录: |