¿Alguien puede explicar por qué es imposible hacer esto en Kotlin?
val x :Int? = 123 val y :Any = xVengo del fondo .NET donde el tipo anulable se puede asignar al tipo de objeto, pero ¿en qué se diferencian?
Los tipos anulables no son subtipos de Any , pero son subtipos de Any? .
Any es solo una superclase de tipos que no aceptan valores NULL . Esto hace posible escribir código que requiere una instancia no nula de cualquier cosa y aún así beneficiarse de la seguridad del verificador de tipos (a diferencia de cuando se usa el Object de Java).
Aquí hay una imagen que puede ayudar:
El siguiente código es un reemplazo válido del suyo:
val x: Int? = 123 val y: Any? = xDe los documentos:
El sistema de tipos de Kotlin tiene como objetivo eliminar el peligro de las referencias nulas del código, también conocido como The Billion Dollar Mistake.
En Kotlin, el sistema de tipos distingue entre las referencias que pueden contener valores nulos (referencias anulables) y las que no (referencias no nulas).
Ejemplo:
var a: String = "abc" a = null // compilation error var b: String? = "abc" //using `String?` allows you to assign null b = null // ok print(b) Any es una clase igual que String , la única diferencia es que cada clase tiene Any como superclase. Pero lo anterior que escribí sobre NPE se aplica a todos los tipos en kotlin.
Sí. El requisito básico para la variable Kotlin es marcar si es anulable o no para evitar NPE.
Aquí en tu caso,
var x: Int? = 123se asigna como valor anulable con ? pero cuando lo asignó a Cualquier objeto, ¿se olvidó de agregar anulable? a cualquier objeto
así que var y: Any? = x
hará lo que estamos marcando anulable para y también.