En Smart Casting , generalmente usamos is o !is un operador para verificar el tipo de variable, y el compilador convierte automáticamente la variable al tipo de destino, pero en el tipo de conversión explícita usamos como operador.
La conversión de tipo explícito se puede hacer usando:
- Operador de reparto inseguro: como
- Operador de reparto seguro: como?
Operador de reparto inseguro: como
Manualmente, usamos el operador de conversión de tipos para convertir una variable al tipo de destino.
En el siguiente programa, la variable str1 de la string se encasilla al tipo de destino usando como operador.
Kotlin
fun main(args: Array<String>){ val str1: String = "It works fine" val str2: String = str1 as String // Works println(str1) }
Producción:
It works fine
Puede haber una posibilidad de que no podamos convertir la variable al tipo de destino y arroja una excepción en el tiempo de ejecución, por eso se llama conversión insegura .
Cuando el tipo Integer se usa para convertir al tipo String, lanza ClassCastException .
Kotlin
fun main(args: Array<String>){ val str1: Any = 11 val str2: String = str1 as String // throw exception println(str1) }
Producción:
Excepción en el subproceso «principal» java.lang.ClassCastException: la clase java.lang.Integer no se puede convertir a la clase java.lang.String
No podemos convertir una string anulable en una string no anulable , y arroja una excepción TypeCastException .
Kotlin
fun main(args: Array<String>){ val str1: String? = null val str2: String = str1 as String // throw exception println(str1) }
Producción:
Excepción en el subproceso «principal» kotlin.TypeCastException: nulo no se puede convertir a un tipo no nulo kotlin.String
Por lo tanto, tenemos que usar el tipo de destino también como una string anulable para que la conversión de tipos no genere ninguna excepción.
Kotlin
fun main(args: Array<String>){ val str1: String? = null val str2: String? = str1 as String? // throw exception println(str1) }
Producción:
null
Operador de reparto seguro: como?
Kotlin también proporciona una instalación de encasillamiento usando un operador de cast seguro como? . Si la conversión no es posible, devuelve un valor nulo en lugar de lanzar una excepción ClassCastException.
Aquí hay un ejemplo, en el que estamos tratando de convertir cualquier tipo de valor de string que el programador conoce inicialmente en una string anulable , luego funciona bien. Cuando inicializamos el valor Any con Integer e intentamos convertirlo en una string anulable, este encasillamiento no es posible y devuelve nulo a str3.
Kotlin
fun main(args: Array<String>){ var str1: Any = "Safe casting" val str2: String? = str1 as? String // it works str1 = 11 // type casting not possible so returns null to str3 val str3: String? = str1 as? String val str4: Int? = str1 as? Int // it works println(str2) println(str3) println(str4) }
Producción:
Safe casting null 11
Publicación traducida automáticamente
Artículo escrito por Praveenruhil y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA