Solución:
Para los tipos de objetos (que no aceptan valores NULL), Kotlin usa la null
valor para marcar que un lateinit
la propiedad no se ha inicializado y lanzar la excepción apropiada cuando se accede a la propiedad.
Para los tipos primitivos, no existe tal valor, por lo que no hay forma de marcar una propiedad como no inicializada y proporcionar los diagnósticos que lateinit
necesita proporcionar. (Podríamos intentar usar un marcador separado de algún tipo, pero ese marcador no se actualizaría al inicializar el campo a través de la reflexión, que es un caso de uso importante de lateinit
).
Por lo tanto, lateinit
se admite solo para propiedades de tipos de objeto.
Una respuesta corta es que con primitivas siempre puedes usar 0
como predeterminado y con tipos que aceptan valores NULL null
por defecto. Solo los tipos no primitivos que no aceptan valores NULL pueden necesitar lateinit
para evitar el tipo de sistema de seguridad.
En realidad, no es necesario inicializar una variable en Kotlin siempre que tenga un valor antes de el primer acceso y puede ser inactivamente demostrado. Lo que significa que este código es perfectamente válido:
fun main(args: Array<String>) {
var x: Int
val y: Double
x = 0
y = x + 0.1
println("$x, $y")
}
Pero hay casos (raros) en los que la inicialización no se puede probar estáticamente. El caso más común es un campo de clase que usa cualquier forma de inyección de dependencia:
class Window {
@Inject lateinit parent: Parent
}