Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
kotlin-如何覆盖哈希代码_Kotlin_Equals - Fatal编程技术网

kotlin-如何覆盖哈希代码

kotlin-如何覆盖哈希代码,kotlin,equals,Kotlin,Equals,我已经重写了java对象的equals方法。(实际上是kotlin中的对象,但它很容易理解,我只是重写了equals方法)。但是现在为了维护equals契约,我还应该重写hashcode方法。但是我不知道如何为适合equals方法的hashcode提供一个实现。以下是我到目前为止的情况: data class AddressModel( var id_address: Int = 0, var id_country: Int = 0, ) { o

我已经重写了java对象的equals方法。(实际上是kotlin中的对象,但它很容易理解,我只是重写了equals方法)。但是现在为了维护equals契约,我还应该重写hashcode方法。但是我不知道如何为适合equals方法的hashcode提供一个实现。以下是我到目前为止的情况:

    data class AddressModel(
        var id_address: Int = 0,
        var id_country: Int = 0,
) {

    override fun equals(other: Any?): Boolean {
        if (this === other) return true
        if (other !is AddressModel)
            return false
        else {
            if (other.id_address == this.id_address)
                return true
        }
        return false
    }
}
override fun hashCode(): Int {
        return Objects.hash(id_address, id_country);
    }
编译器强烈建议我重写hashCode方法。但我不知道该实施什么。在equals覆盖中,我只想检查addressModel是否与另一个具有相同的Id,如果它具有相同的Id,那么我假设它是相等的

这就是我到目前为止所做的:

    data class AddressModel(
        var id_address: Int = 0,
        var id_country: Int = 0,
) {

    override fun equals(other: Any?): Boolean {
        if (this === other) return true
        if (other !is AddressModel)
            return false
        else {
            if (other.id_address == this.id_address)
                return true
        }
        return false
    }
}
override fun hashCode(): Int {
        return Objects.hash(id_address, id_country);
    }
但我认为这样更好:

override fun hashCode(): Int {
            return Objects.hash(id_address); //base hash off same as equals the id_address
        }
这是我推荐的阅读方式,但它意味着什么?如果我添加了更多的类字段,我还需要向Objects.hash方法添加更多字段吗?我更喜欢使用老的skool方法,因为这个调用需要androidapi 19,我支持lower(api 16)

明确地说,我理解如果我不重写hashcode和equals,那么每个实例,例如“newaddressmodel(707867)”,都会有不同的hashcode。然后,例如HashMap会认为这些对象是不同的,不等于在计算存储哈希时替换它们。但是我不知道在hashCode实现中放什么。您可以用kotlin或java向我展示它的ok

更新:这是否足够:

override fun hashCode(): Int { return id_address.hashCode() }
示例POJO类(dataVO)覆盖hashcode和equals, @数据:

有用链接:

由于#equals()仅取决于
id_地址
,因此应在哈希代码计算中使用它。我希望:

override fun hashCode() = Objects.hash(id_address)

根据接受的规则,如果您有两个.equals()对象,但具有不同的哈希代码,则会丢失!这些链接可能不会有用:我已经说过同样的话。我在问你能不能帮我知道如何实现hashCode(),我能做什么:override-fun-hashCode():Int{return-id\u address.hashCode()注意:你可以将'equals'方法简化为一行:override-fun-equals(other:Any?=this==other | | |(other是AddressModel&&id\u address==other.id\u address)。改为使用return id.hashCode()会更好吗?我知道你的意思了。现在我实现了以下内容:override fun hashCode()=id\u addressObjects.hash对我不可用,因为我支持旧设备。你能告诉我如何使用旧方法吗?我可以只使用override fun hashCode()吗=id\u address.hashCode(),然后我还必须知道如果id\u address为null,该怎么办。我是这样做的。我将id\u address默认为零。感谢您的帮助。您还可以使用elvis运算符在hashCode:override fun hashCode()中支持null=id\u address?:-12345//或任何其他任意值,最好不要为零,因为如果id\u address通常为零,则会产生哈希冲突。请注意,在Kotlin的最新版本(我认为是1.3或更高版本)中,即使在空对象上也可以调用哈希代码。有关详细信息,请参阅。因此,在这种情况下,不需要elvis运算符。很好的一个@SomeGuy