I'm learning Kotlin, with a C++ and Java background. I was expecting the following to print true
, not false
. I know that ==
maps to equals
. Does the default implementation of equals
not compare each member, i.e. firstName
and lastName
? If so, wouldn't it see the string values as equal (since ==
maps to equals
again)? Apparently there's something related to equality versus identity that I haven't got right in Kotlin yet.
class MyPerson(val firstName: String, val lastName: String)
fun main(args: Array<String>) {
println(MyPerson("Charlie", "Parker") == MyPerson("Charlie", "Parker"))
}
Java
In Java, the default implementation of equals
compares the variable's reference, which is what ==
always does:
The
equals
method for classObject
implements the most discriminating possible equivalence relation on objects; that is, for any non-null reference values x and y, this method returnstrue
if and only if x and y refer to the same object (x == y
has the valuetrue
).
We call this "referential equality".
Kotlin
In Kotlin ==
is compiled to equals
, whereas ===
is the equivalent of Java's ==
.
Whenever we want rather structural than referential equality, we can override equals
, which is never done by default for normal classes, as you suggested. In Kotlin, we can use data class
, for which the compiler automatically creates an implementation based on the constructor properties (read here).
Please remember to always override hashCode
if you override equals
(and vice versa) manually and stick to the very strict contracts of both methods. Kotlin's compiler-generated implementations do satisfy the contract.
The default equals
implementation you're describing exists only for data classes. Not for regular classes where the implementation is inherited from Any
, and just make the object equal to itself.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With