¿Cuál es la diferencia entre el operador "como" y "es" en Kotlin?

En Java, puedo escribir código como:

void cast(A a) { if(a instanceof Person) { Person p = (Person) a; } } 

En Kotlin, ¿qué debería hacer? ¿Usar as operador o is operador?

is X es el equivalente de instanceof X

foo as X es el equivalente de ((X) foo)

Además, Kotlin realiza casting inteligente siempre que sea posible, por lo que no es necesario un lanzamiento adicional después de comprobar el tipo utilizando:

 open class Person : A() { val foo: Int = 42 } open class A 

y entonces:

 if (p is Person) { println(p.foo) // look, no cast needed to access `foo` } 

is comprobación de tipo. Pero Kotlin tiene un elenco inteligente. lo que significa que puede usar a Person similar después de la verificación de tipo.

 if(a is Person) { // a is now treated as Person } 

as es el tipo de casting . Sin embargo, no se recomienda porque no garantiza la security en time de ejecución. (Puede pasar un object incorrecto que no se puede detectar en el momento comstackdo).

Kotlin tiene un reparto seguro as? . Si no se puede convertir, devolverá nulo en su lugar.

 val p = a as? Person p?.foo() 

Según los documentos oficiales de Kotline

  1. Normalmente, el operador de reparto lanza una exception si el lanzamiento no es posible. Por lo tanto, lo llamamos inseguro. El reparto inseguro en Kotlin lo realiza el operador infijo como

     val x: String = y as String 

Tenga en count que null no se puede convertir a String ya que este tipo no admite valores NULL, es decir, si y es nulo, el código anterior arroja una exception. Para hacer coincidir la semántica de lanzamiento de Java, tenemos que tener el tipo de nulo al lado derecho del lanzamiento, como:

  val x: String? = y as String? 

Así que aquí el uso es en lugar de como

  fun cast(a: A) { if (a is Person) { val p = a as Person } } 

as se usa para el moldeado de tipo explícito

 val p = a as Person; 

is exactamente lo mismo que instanceof en Java. Que se usa para verificar si un object es una instancia de una class

 if(a is Person) { // a is an instance of Person } 

¡También puedes usar !is como no es un object de una class

 fun cast(a: A) { if(a is Person) { val p = a as Person; } } 

asi que

 if(a is Person){ a as Person }else{ null } 

equivalente

 a as? Person 

Es esta respuesta?