Будет ли data class переопределять hashCode и equals если наследуется от кого-то в Kotlin

«Будет ли data class переопределять hashCode и equals если наследуется от кого-то в Kotlin» — вопрос из категории Kotlin, который задают на 23% собеседований Android Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Если data class наследуется от другого класса, он не будет автоматически генерировать equals(), hashCode(), toString() и copy(), если родительский класс объявлен как open или abstract и имеет нефинальные (final в Java) реализации этих методов. Kotlin требует, чтобы родительские методы были final для корректной генерации.

open class Parent {
    open fun equals(other: Any?) = super.equals(other) // Нефинальный метод
}

data class Child(val x: Int) : Parent() // Не сгенерирует equals/hashCode!

Решение:

  1. Сделать родительские методы final (если возможно).
  2. Вручную переопределить equals/hashCode в data class.
  3. Использовать композицию вместо наследования.