使用密封类时,MutableSet 不会防止重复内容

fel*_*rce 4 kotlin

如果我使用MutableSetwith sealed class,则MutableSet接受所有重复的内容。

样本:

sealed class LoginSavedCommand {
    class Login(val email: String, val password: String) : LoginSavedCommand()
    class SaveData(val email: String, val password: String) : LoginSavedCommand()
}

fun main(args: Array<String>) {

    val mSet: MutableSet<LoginSavedCommand> = hashSetOf()

    mSet.add(LoginSavedCommand.Login("oba", "pass"))
    mSet.add(LoginSavedCommand.Login("faiii", "blabla"))

    if (mSet.add(LoginSavedCommand.Login("oba", "pass"))) {
        println("don't")
    } else {
        println("do")
    }
}
Run Code Online (Sandbox Code Playgroud)

我将相同的值传递给LoginSavedCommand.Login,但MutableSet继续接受添加相同的值(在示例中println打印“不”,并且我需要打印“做”,因为我需要使用此来防止重复内容selaed class

hot*_*key 6

A通过使用 elements\'检查MutableSet来检查它是否包含元素,并且根据实现,. 例如,A用于存储和快速查找哈希表中的元素。equalshashCodeHashSethashCode

\n\n

您的示例中的两个子类sealed class不会覆盖equals函数,因此提供默认的相等性检查实现,即身份相等(即一个对象仅等于其自身,并且不同的对象永远不会相等,即使它们的属性相等)。

\n\n

为了实现LoginSavedCommand中项目的唯一性MutableSet,您需要确保子类提供适当的相等检查实现。

\n\n
\n\n

一个简单的方法是创建两个子类data classes,以便编译器根据属性生成equals和实现:hashCode

\n\n
sealed class LoginSavedCommand {\n    data class Login(val email: String, val password: String) : LoginSavedCommand()\n    data class SaveData(val email: String, val password: String) : LoginSavedCommand()\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

(可运行示例)

\n\n
\n\n

或者,在子类中手动重写equals和函数。hashCode

\n\n

重要提示:equals重写这些函数时,请确保实现遵循和 的API 参考中描述的函数约定hashCode

\n\n

例如:

\n\n
sealed class LoginSavedCommand {\n    class Login(val email: String, val password: String) : LoginSavedCommand() {\n        override fun equals(other: Any?): Boolean {\n            if (this === other) return true\n            if (javaClass != other?.javaClass) return false\n\n            other as Login\n\n            if (email != other.email) return false\n            if (password != other.password) return false\n\n            return true\n        }\n\n        override fun hashCode(): Int {\n            var result = email.hashCode()\n            result = 31 * result + password.hashCode()\n            return result\n        }\n    }\n\n\n    class SaveData(val email: String, val password: String) : LoginSavedCommand() {\n        /* ... */\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

这些实现由 IntelliJ IDEA 使用类主体中的Generate...\xe2\x86\x92操作生成。equals() and hashCode()

\n