Ser*_*rev 7 equality-operator kotlin
比较运算符==
和===
Kotlin 中的比较运算符有什么区别?
class A {
var foo = 1
}
var a1 = A()
var a2 = A()
println(a1 == a2) // output false
println(a1 === a2) // output false
a1 = a2
println(a1 == a2) // output true
println(a1 === a2) // output true
Run Code Online (Sandbox Code Playgroud)
在 Kotlin 中,有两种类型的相等性可用。它们是:结构平等和参照平等。
class A {
var foo = 1
}
var a1 = A()
var a2 = A()
Run Code Online (Sandbox Code Playgroud)
这里a1
和a2
是 class 的两个实例A
。
println(a1 == a2)
Run Code Online (Sandbox Code Playgroud)
它打印false
因为a1
和a2
在结构上不相等。
println(a1 === a2)
Run Code Online (Sandbox Code Playgroud)
它打印,false
因为a1
和a2
没有引用同一个对象。
但是,如果你执行这一行:a1 = a2
那么,
a1 和 a2 将在结构上相等,并且 a1 引用 a2 实例。这就是为什么,
println(a1 == a2)
println(a1 === a2)
Run Code Online (Sandbox Code Playgroud)
这两行都返回true。
简而言之,来自文档:
在 Kotlin 中,有两种类型的相等:
equals()
)=>==
===
详细解答:
==
)的否定对应物==
是!=
按照惯例,像这样的表达式a == b
被翻译成:
a?.equals(b) ?: (b === null)
Run Code Online (Sandbox Code Playgroud)
如果a
不是null
,则调用该equals(Any?)
函数,否则检查b
是否引用等于null
。
要提供自定义 equals 检查实现,请覆盖该equals(other: Any?): Boolean
函数。具有相同名称和其他签名的函数,例如 equals(other: Foo) ,不会影响运算符==
and 的相等性检查!=
。
===
)的否定对应物===
是!==
a === b
评估为true
当且仅当a
和b
指向同一个对象。对于在运行时表示为原始类型的值(例如,Int
),===
相等性检查等效于==
检查。
让我们假设 的定义A
与您在问题中定义的一样。
>>> var a1 = A()
>>> var a2 = A()
>>> a1 == a2 // a1 and a2 are different instances of A
false
>>> a1 == a1
true
>>> a2 == a2
true
>>> a1 === a2 // a1 and a2 have references to different objects
false
Run Code Online (Sandbox Code Playgroud)
对于常规类, 的实现equals
是从 继承的Any
,并且只是使对象等于自身。
>>> var a1 = A()
>>> var a2 = A()
>>> a1 = a2
>>> a1 == a2
true
>>> a1 === a2
true
Run Code Online (Sandbox Code Playgroud)
a1
并a2
指向同一个对象,这就是为什么a1 == a2
并a1 === a2
返回 true。
让我们覆盖equals(Any?)
的A
,如下所示:
class A {
var foo = 1
override fun equals(other: Any?): Boolean {
if (other == null || other !is A)
return false
return foo == (other as A).foo
}
}
Run Code Online (Sandbox Code Playgroud)
现在让我们运行以下命令:
>>> var a1 = A()
>>> var a2 = A()
>>> a1 == a2
true
>>> a1 === a2
false
Run Code Online (Sandbox Code Playgroud)
请注意,即使它们引用不同的对象,a1
并且a2
在结构上也是相等的。
归档时间: |
|
查看次数: |
4100 次 |
最近记录: |