Kotlin: Intrinsics.areEqual loop infinito (desbordamiento de stack)

java.lang.StackOverflowError at kotlin.jvm.internal.Intrinsics.areEqual(Intrinsics.java:164) at plugin.interaction.inter.teleports.Category.equals(Category.kt) at kotlin.jvm.internal.Intrinsics.areEqual(Intrinsics.java:164) at plugin.interaction.inter.teleports.Destination.equals(Destination.kt) 

.equals partir de una comparación de .equals entre dos classs de datos sin relación.

Error principal.

 data class Category(val name: String, val destinations: MutableList<Destination>) data class Destination(val category: Category, val name: String) 

Las classs de datos en Kotlin son solo azúcar sintáctica para POJOs de Java.

El principal culpable en su ejemplo es este ciclo:

val destinations: MutableList<Destination> en Category &
val category: Category en Destination

Debe eliminar este ciclo moviendo cualquiera de las dos variables fuera del constructor de class de datos primario.

Sin embargo, también hay un efecto secundario mucho más grande: data class Category(..) es mutable , lo que hará que (y cualquier otra class de datos que use categorías en su constructor primario) sea inseguro usar como keys en cualquier hash- colección basada Para get más información, consulte: ¿Las teclas de hashmap mutables son una práctica peligrosa?

Dado que las classs de datos están pensadas para datos puros, recomiendo eliminar la val category: Category en data class Destination(..) y cambiar tipo de val destinations: MutableList<Destination> en data class Category(..) a List<Destination> solo lectura List<Destination> . Para romper el estado inmutable después de dichos cambios, deberá realizar moldes inseguros desde Kotlin o crear una instancia de la class desde Java.

Sin embargo, si requiere absolutamente una reference a categorías en destinos (y no usa sus classs en hashmaps / -sets / etc.), Puede hacer que Destination sea una class regular e implementar equals / hashCode usted mismo, o mover la categoría fuera de el constructor primario. Esto es un poco complicado, pero se puede hacer con un constructor secundario:

 data class Destination private constructor(val name: String) { private lateinit var _category: Category val category get() = _category constructor(category: Category, name: String) : this(name) { _category = category } } 
  • ¿Kotlin es compatible con Ormlite en 100%? (Clases de datos)
  • Cómo corregir la firma del método de extensión genérico en kotlin para resolver "Falló la inferencia de tipo" en kotlin
  • Kotlin. Aplicación básica de JavaFX
  • Sabor del producto: class duplicada encontrada
  • El tipo de propiedad no es un tipo de excedente
  • Cómo usar Data Binding y Kotlin en Android Studio 3.0.0
  • Kotlin - Inicialización de propiedad usando "por perezoso" vs. "tardío"
  • Aplicación de Android en Gradle: no se puede combinar dex
  • Los colors de Android Material Design no se aplican de forma coherente
  • Cómo usar la expresión `with` de Kotlin para types anulables
  • En la function kotlin android tailrec devuelve 0