我想知道為什么相等方法 (==) 不能按預期作業。
有沒有辦法修復下面代碼中的注釋部分?
如您所見,p1 和 p2 不相等,既不是參考也不是值。那么為什么 p1 == p2 是真的?!
object Main {
@JvmStatic
fun main(args: Array<String>) {
val f1 = Foo(1)
Thread.sleep(3) // to set a different value in parent of f2
val f2 = Foo(1)
val p1 = (f1 as Parent)
val p2 = (f2 as Parent)
println(p1 == p2) // true
println(p1.b == p2.b) // false
}
}
data class Foo(val a: Int) : Parent("$a-${System.currentTimeMillis()}")
sealed class Parent(val b: String) {
override fun equals(other: Any?): Boolean {
if (this === other) return true
if (javaClass != other?.javaClass) return false
other as Parent
if (b != other.b) return false
return true
}
override fun hashCode(): Int {
return b.hashCode()
}
}
uj5u.com熱心網友回復:
這不像您期望的那樣表現的原因是因為 adata class自動為您提供了 的實作equals(),它檢查(僅)在其建構式中指定的屬性的值。
所以你data class Foo(val a: Int)得到一個equals()只檢查 的值a,覆寫Parent類中的值。
一般來說,data classes 是簡單的值持有者,其值完全由這些屬性表征,因此自動生成的equals()(和hashCode()和toString()和copy()和componentX()方法)很有意義。如果這不適用,則 adata class可能不適合您的情況。
uj5u.com熱心網友回復:
有一種解決方案,您必須在 Foo 類中顯式覆寫 equals 和 hashCode 方法。然后它會正常作業。
object Main {
@JvmStatic
fun main(args: Array<String>) {
val f1 = Foo(1)
Thread.sleep(3)
val f2 = Foo(1)
val p1 = (f1 as Parent)
val p2 = (f2 as Parent)
println(p1 == p2) // false
println(p1.b == p2.b) // false
}
}
data class Foo(val a: Int) : Parent("$a-${System.currentTimeMillis()}") {
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 Foo
if (a != other.a) return false
return true
}
override fun hashCode(): Int {
var result = super.hashCode()
result = 31 * result a
return result
}
}
sealed class Parent(val b: String) {
override fun equals(other: Any?): Boolean {
if (this === other) return true
if (javaClass != other?.javaClass) return false
other as Parent
if (b != other.b) return false
return true
}
override fun hashCode(): Int {
return b.hashCode()
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/392502.html
標籤:科特林
上一篇:去除影像區域之間的間隙
