Grigorii Yurkov
05/17/2021, 12:36 PMequals
and hashCode
(for class A
) with violating hashcode
contract. Is it bug, or am I wrong?kqr
05/17/2021, 12:41 PMkqr
05/17/2021, 12:41 PMGrigorii Yurkov
05/17/2021, 12:41 PMkqr
05/17/2021, 12:43 PMGrigorii Yurkov
05/17/2021, 12:48 PMArjan van Wieringen
05/17/2021, 1:07 PMval a1 = A()
val a2 = A()
val result = a1 == a2 // should this be true or false
if result
should be true then you should implement hashcode for A as being something fixed and not return the virtual memory address (which is default behavior).Grigorii Yurkov
05/17/2021, 1:09 PMArjan van Wieringen
05/17/2021, 1:10 PMArjan van Wieringen
05/17/2021, 1:11 PMGrigorii Yurkov
05/17/2021, 1:12 PMGrigorii Yurkov
05/17/2021, 1:12 PMArjan van Wieringen
05/17/2021, 1:12 PMval a1 = A(1);
val a2 = A(2);
val result = a1 == a2.
What must result be in your opinion?Grigorii Yurkov
05/17/2021, 1:12 PMArjan van Wieringen
05/17/2021, 1:13 PMGrigorii Yurkov
05/17/2021, 1:13 PMGrigorii Yurkov
05/17/2021, 1:16 PMGrigorii Yurkov
05/17/2021, 1:16 PMArjan van Wieringen
05/17/2021, 1:16 PMArjan van Wieringen
05/17/2021, 1:16 PMGrigorii Yurkov
05/17/2021, 1:18 PMArjan van Wieringen
05/17/2021, 1:18 PMGrigorii Yurkov
05/17/2021, 1:18 PMGrigorii Yurkov
05/17/2021, 1:21 PMArjan van Wieringen
05/17/2021, 1:21 PMArjan van Wieringen
05/17/2021, 1:21 PMB
causes some issues here. I am trying some stuff out in IntelliJ.Grigorii Yurkov
05/17/2021, 1:22 PMArjan van Wieringen
05/17/2021, 1:23 PMopen class B {
override fun equals(other: Any?): Boolean {
if (this === other) return true
if (javaClass != other?.javaClass) return false
return true
}
override fun hashCode(): Int {
return javaClass.hashCode()
}
}
class A(val i: Int): B() {
override fun equals(other: Any?): Boolean {
if (this === other) return true
if (javaClass != other?.javaClass) return false
if (!super.equals(other)) return false
other as A
if (i != other.i) return false
return true
}
override fun hashCode(): Int {
var result = super.hashCode()
result = 31 * result + i
return result
}
}
This is what my IntelliJ generates for an empty class.Arjan van Wieringen
05/17/2021, 1:24 PMB.hashCode
depends on the javaClass
which is constant over different instances.Arjan van Wieringen
05/17/2021, 1:24 PMArjan van Wieringen
05/17/2021, 1:26 PMGrigorii Yurkov
05/17/2021, 1:26 PMif (!super.equals(other)) return false
this line also helpGrigorii Yurkov
05/17/2021, 1:26 PMGrigorii Yurkov
05/17/2021, 1:26 PMArjan van Wieringen
05/17/2021, 1:27 PMGrigorii Yurkov
05/17/2021, 1:29 PMMichael Böiers
05/17/2021, 1:50 PMArjan van Wieringen
05/17/2021, 1:57 PM