Kotlin: constructor secundario con esta palabra key

data class DisjointSetNode<T>(var parent: DisjointSetNode<T>, var data: T, var rank: Int) { constructor(data: T): this(parent = this, data = data, rank = 0) 

Me preguntaba por qué recibo un error al decir que no puedo usar la palabra key this en la llamada al constructor porque no he llamado primero al constructor de la superclass. No hay una superclass, y quiero ser padre. ¿Alguna idea de cómo iba a hacer esto?

el problema es que no se puede llamar a this durante la llamada a otro constructor por this(...) . puedes echarle un vistazo a JLS :

Es un error en time de compilation para un constructor invocarse directa o indirectamente a través de una serie de una o más invocaciones de constructor explícitas que involucran esto .

  • significa directamente llamar this en this(...) en la primera statement, por ejemplo: this(this); .

  • indirectamente significa llamar a sus miembros durante la llamada a this(...) , por ejemplo: this(parent) .

pero puede hacer que el constructor primario sea un constructor secundario para lograr su objective, por ejemplo:

 data class DisjointSetNode<T>(var data: T, var rank: Int = 0) { var parent: DisjointSetNode<T> = this constructor(parent: DisjointSetNode<T>, data: T) : this(data = data){ this.parent = parent } } 

No puede hacer reference a this en este context porque aún no está definido.

Sin embargo, puedes mover al parent fuera de la firma del constructor. p.ej:

 data class DisjointSetNode<T>(var data: T, var rank: Int = 0) { var parent: DisjointSetNode<T> = this } 
  • Función superior con generics en kotlin
  • ¿Cómo cambia el tamaño de 6 a 2 en Kotlin?
  • MPAndroidChart datos en vivo no visibles sin límites iniciales
  • Pruebas de Espresso con Kotlin
  • Enlace de datos de Android y Kotlin
  • Debería hashCode () devolver el ID único de un object
  • Kotlin - Diferencia entre el bucle "forEachIndexed" y "for in"
  • Diferentes posiciones de destino cuando se usan diferentes tamaños de vista con ObjectAnimator
  • Interoperabilidad de Java: aplique @JvmName a los buscadores de properties en la class de interfaz o abstracta
  • kotlin cómo referir el scope externo esto en funciones de aplicación multicapa
  • Valor de campo de sum de JOOQ: BigDecimal a Int