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 } } 
  • Problema recursivo con toString en Kotlin
  • Convierta la actividad principal con la barra de acciones / barra de herramientas y el button de acción flotante a Anko
  • Kotlin 0.11.91 Sin resolver Referencia: inv ()
  • ¿Cuál es la forma correcta de declarar el tipo de variable en Android con Kotlin?
  • convertir hashmap de Android a kotlin
  • Tipo no coincidente: ¿tipo inferido es Cadena? pero se esperaba String en kotlin
  • Error de testing de unidad de data binding de Android Error al analizar las opciones del comstackdor de data binding. Params:
  • RxJava: cómo devolver el tipo correcto de nulo
  • Clases internas selladas
  • Obtener files adjuntos de publicaciones de Facebook devolver NullPointerException
  • kotlin: cómo puedo llamar a la function desde la expresión del object