¿Cuál es la diferencia entre var name: String? y var nombre: Cadena

Soy nuevo en Kotlin Programming Lang. He estado desarrollando aplicaciones en Android. ¿Encontré una class de datos que toma el constructor con String? y String ¿Alguien puede hacerme entender esto?

 data class Person(var name: String?) { //... } data class Person(var name: String) { //... } 

String? puede ser nulo y String no puede ser nulo, eso es todo lo que hay que hacer.

Cuando usas ? , dice, también puede tener valor nulo. Porque Kotlin impone security nula .

Ver comentarios en el siguiente código:

 data class Person(var name: String?) { // This can have null value also //... } data class Person(var name: String) { // This can not have a null value, it will give compile time error. //... } 

Los "?" el operador define la capacidad nula de una variable.

Ejemplos:

Acepte el tipo de cadena pero también acepte el valor nulo.

 var x :String? = "" x = null // works fine 

Solo acepte el tipo String, en caso de que intente establecer su valor en nulo provocará un error de compilation.

 var x :String = "" x = null // will provoke a comstacktion error. 

Es importante tener en count después de comprobar el valor nulo de una variable que se convertirá automáticamente en un tipo que no admite nulos.

 fun test() { var x: String? = "" x = null // works fine x = "String type" // works fine if(x == null) { println("The var x can't be null") return } x = null // will provoke a comstacktion error. } fun main(args: Array<String>) { test() } 

Documentación de Kotlin, security nula

Una variable declarada con ? indica que la variable puede ser nula o no .

De lo contrario, se interpreta como un valor no nulo.

Dicha característica se agregó explícitamente a Kotlin para networkingucir / prevenir un error de time de ejecución común, NullPointerException .

Por ejemplo:

 var a: String? = "abc" a.length // Compile Time Error, trying to access possibly null value var b: String = "xyz" b.length // No Error, the value is never null 

Habiendo dicho eso, ¡puedes afirmar que un valor no es nulo !! que eliminará el error del comstackdor, pero agrega el riesgo de un NPE:

 var a: String? = "abc" a!!.length // Will cause Run Time Exception if a is null 

El ? sería para operador de casting seguro para kotlin . Por ej. si tenemos una operación de lanzamiento como:

 val x: String = y as String 

y si y es null , entonces el código anterior emitirá una exception. Para evitar esto, podemos usar el operador de conversión segura ( ? ). El fragment de arriba se convierte en:

 val x: String? = y as? String 

Esto devolverá null si hay algún tipo de falla durante el lanzamiento. Encuentre la lectura en este enlace

  • Función genérica con matriz 2D genérica
  • Kotlin: exception de documento lanzada por un método de interfaz
  • Extensiones de Kotlin / properties sintéticas: mismo object en múltiples invocaciones de Fragment.onViewCreated ()
  • Animación dinámica de BottomSheet peekHeight
  • Controlador de enlace con clic en TextView
  • Uso de LiveData con data binding
  • TextColor está cambiando a uno incorrecto
  • ¿Por qué hay una diferencia entre los constructores de coroutine para CompletableFuture y ListenableFuture?
  • Mapeo a less que la exception
  • ¿Por qué este object Kotlin puede henetworkingar de sí mismo?
  • Google Espresso: borre los datos del usuario en cada testing