Дублирующие элементы в наборе

В Kotlin у меня есть MutableSet класса данных. Класс данных не переопределяет equals() или hashCode() . Я встречал ошибки, связанные с повторяющимися объектами в наборе, и я заметил, что вызов foo.containsAll(foo) возвращает false для набора.

Я прошел через каждый элемент в наборе и только несколько возвращает false для foo.contains(foo.toList()[i]) . Для тех, кто это делает, вызов foo.toList()[i] == foo.toList()[i] возвращает true . Итак, проверка равенства работает.

Что здесь происходит?

Я считаю, что единственный способ, которым это возможно (без отражения и т. Д.), – это если ваш класс данных содержит что-то изменяемое и состояние изменения экземпляра после добавления в набор и т. Д., Например

 data class Foo(var int: Int = 0) data class Bar(val string: String, val foo: Foo = Foo()) val bars = mutableSetOf<Bar>() bars += Bar("") bars += Bar("") println(bars.containsAll(bars)) // true bars.first().foo.int = 12 println(bars.containsAll(bars)) // false 

Это связано с тем, что результат hashCode() используется в наборе для его идентификации, но если состояние изменяется в экземпляре вашего класса данных, то у него, вероятно, будет другое значение хэша, вызывающее такие проблемы.

В общем случае элементы в наборах и ключах на картах должны быть неизменными, чтобы избежать этой проблемы.

Intereting Posts
java.lang.IllegalArgumentException: параметр, заданный как ненулевой, равен null: метод kotlin.jvm.internal.Intrinsics.checkParameterIsNotNull Извлечение строк для kotlin в андроид-студии? Обновление Kotlin от 1.0.2 до 1.0.3: java.lang.NoSuchMethodError: виртуальный метод не предоставленInjectedData $ app_compileDebugKotlin () Как использовать неизменяемые постоянные коллекции в Котлине? Почему вы не можете указывать петли var / val в Котлине? @Inject set Not Injecting Property Относительные параметры макета в котлин Recyclerview: прослушивание событий с добавлением кликов Неверное поведение Maybe <List <T >> в комнате? Android: реорганизовать множество групп переключателей в одном действии Исключение происходит во время действия Expression Expression: Как определить параметры типа для основного конструктора в Котлине? Извлечение URL-адреса в Android Kotlin асинхронно Длина конечной точки, огурца и Windows Kotlin: Как проверить, содержит ли перечисление заданную Строку, не входя в Исключения?