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: For-loop debe tener un método de iterador, ¿es esto un error?
  • Cuándo usar los methods de extensión?
  • Kotlin: ¿solución alternativa para no lateinit cuando se usa setter personalizado?
  • No se puede conseguir que las classs de Kotlin en el proyecto Java maven funcionen (Eclipse)
  • Importación de jarras en kotlin REPL
  • RxJava - ¿Entradas de keyboard de contrapresión?
  • Convenciones de nomenclatura de files para Kotlin
  • Patrón Regex Kotlin
  • Recepción de parameters de formulario en el server de Ktor
  • Convierte un proyecto de Android para usar Gradle Script Kotlin
  • ¿Cómo obtengo la identificación del documento de Firestre utilizando las classs de datos de kotlin?