Kotlin | Casting de tipo explícito

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: 
 

  1. Operador de reparto inseguro: como
  2. 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

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *