Llamar al constructor de super class en Kotlin, Super no es una expresión

Tengo dos classs Entity y Account como

 abstract class Entity( var id: String? = null, var created: Date? = Date()) { constructor(entity: Entity?) : this() { fromEntity(entity) } fun fromEntity(entity: Entity?): Entity { id = entity?.id created = entity?.created return this; } } 

y

 data class Account( var name: String? = null, var accountFlags: Int? = null ) : Entity() { constructor(entity: Entity) : this() { super(entity) } } 

Lo cual me da el error

Super no es una expresión, solo se puede usar en el lado izquierdo de un punto '.'

¿Por qué no puedo hacer eso?

Lo siguiente pasará el error de compilation, pero no estoy seguro de si es correcto.

  constructor(entity: Entity) : this() { super.fromEntity(entity) } 

Tienes un par de problemas en tu código.

Primero, esta es la syntax correcta, para llamar a un súper constructor desde un constructor secundario:

 constructor(entity: Entity) : super(entity) 

En segundo lugar, no puede llamar a un superconstructor de un constructor secundario si su class tiene un constructor primario (que su class).

Solución 1

 abstract class Entity( var id: String, var created: Date ) class Account( var name: String, var accountFlags: Int, id: String, created: Date ) : Entity(id, created) { constructor(account: Account) : this(account.name, account.accountFlags, account.id, account.created) } 

Aquí, el constructor de copy está en la class secundaria que simplemente delega en el constructor primario.

Solución 2

 abstract class Entity( var id: String, var created: Date ) { constructor(entity: Entity) : this(entity.id, entity.created) } class Account : Entity { var name: String var accountFlags: Int constructor(name: String, accountFlags: Int, id: String, created: Date) : super(id, created) { this.name = name this.accountFlags = accountFlags } constructor(account: Account) : super(account) { this.name = account.name this.accountFlags = account.accountFlags } } 

Aquí solo estoy usando constructores secundarios en la class secundaria, lo que me permite delegarlos en super constructores individuales. Observe cómo el código es bastante largo.

Solución 3 (más idiomática)

 abstract class Entity { abstract var id: String abstract var created: Date } data class Account( var name: String, var accountFlags: Int, override var id: String, override var created: Date ) : Entity() 

Aquí omití los constructores de copy e hice abstractas las properties para que la class hija tenga todas las properties. También hice que la class infantil fuera una data class . Si necesita clonar la class, simplemente puede llamar a account.copy() .

Utilice esta super<Entity>.fromEntity(entity) para llamar a los methods de super<Entity>.fromEntity(entity) .

Como dice la documentation:

En Kotlin, la inheritance de implementación está regulada por la siguiente regla: si una class henetworkinga muchas implementaciones del mismo miembro de sus superclasss inmediatas, debe anular a este miembro y proporcionar su propia implementación (tal vez, utilizando una de las henetworkingadas). Para denotar el supertipo del que se toma la implementación henetworkingada, usamos supercalificado por el nombre del supertipo entre corchetes angulares, por ejemplo, super.

 constructor(entity: Entity) : this() { super<Entity>.fromEntity(entity) } 

Para saber más leer Reglas Anuladas

  • Cómo comparar una class <*> contra un tipo primitivo en caja Java sin las advertencias del comstackdor de Kotlin
  • La actualización automática de la versión de la biblioteca para proyectos Gradle no está soportada actualmente. Actualice su build.gradle manualmente
  • Kotlin: ¿algún sustituto del object compañero dentro de otro object (no class)?
  • Agregar Kotlin al proyecto de Java existente rompe los errores gradle de Android Studio
  • ¿Por qué Kotlin no puede inferir el siguiente argumento lambda (después de la conversión de Java -> Kotlin)?
  • ¿Cómo configurar la versión del código de bytes de Kotlin en el proyecto Gradle para Java 8?
  • Property getter tipeado en Supertipo en lugar de Implementación en Kotlin
  • Orden de cálculo de operadores bit a bit en Kotlin
  • ViewPager en Fragment no está funcionando por segunda vez
  • Ejecute Klotlin REPL desde el context de mi proyecto Maven?
  • IncompatibleClassChangeError: Class 'java.lang.VirtualMachineError' no implementa la interfaz 'java.lang.CharSequence'