La variable de anulación crea un NPE cuando se usa una variable en la initialization en la superclass

Digamos que tenemos la siguiente configuration:

open class Foo(open val img: Image) { val use = img.graphics } class Bar(override val img: BuffenetworkingImage) : Foo(img) 

En la initialization, el uso de img.width crea un NPE. Lo que creo que es el problema, es que aparentemente, a pesar de que img se pasa en el constructor de Foo directamente en Bar, cuando se usa en Foo no lo señala, sino que apunta a la variable anulada en la class Bar. ¿Cómo puedo evitar esto?

Este comportamiento es causado por el hecho de que el getter de img se anula y devuelve el valor de un campo diferente (ya que Bar anula img con un tipo diferente, se requiere crear un campo adicional de tipo BuffenetworkingImage ). El constructor Foo se ejecuta antes de que ese campo se asigne en Bar .

En general, debe evitar el uso de miembros abiertos en la lógica de initialization de sus classs, ya que pueden anularse en las subclasss y pueden depender de algún estado que, tras el time de initialization de la superclass, aún no se haya inicializado correctamente.

Para su caso particular, haga img en el constructor Foo un parámetro simple y use el parámetro explícitamente:

 open class Foo(img: Image) { open val img = img val use = img.graphics } 
  • compileReleaseKotlin falla con java.lang.ClassNotFoundException: com.sun.tools.javac.util.Context
  • ¿Cómo evito expresiones de objects para funciones que devuelven una interfaz SAM?
  • subclass val para usar en el constructor base
  • Instancia de class Kotlin assertEqual
  • Kotlin JSR-223 ScriptEngineFactory dentro del contenedor de grasa - No se puede encontrar el comstackdor de kotlin
  • ¿Cuál es el tipo de setContentView ()
  • ¿Qué significa el código this @ MainActivity?
  • Android - RoomDb - La entidad insertada con éxito no se encuentra en la consulta de selección en otra actividad
  • ¿Cómo funciona la syntax de acceso a la propiedad de Kotlin para las classs de Java (es decir, EditText setText)?
  • Kotlin NumberFormatException
  • ¿Cómo puedo cambiar la versión del comstackdor de Kotlin en IntelliJ?