Clases de datos Kotlin y types anulables

Soy nuevo en Kotlin y no sé por qué el comstackdor se queja de este código:

data class Test(var data : String = "data") fun test(){ var test: Test? = Test("") var size = test?.data.length } 

El comstackdor se queja con test?.data.length , dice que debo hacer: test?.data?.length . Pero la variable de datos es String , no String? , entonces no entiendo por qué tengo que poner el ? cuando quiero verificar la longitud.

La test?.data.length expresión test?.data.length es equivalente a (test?.data).length , y la parte de test?.data es anulable: es test.data o null . Por lo tanto, no es nulo-seguro para get su length , pero en su lugar debe usar el operador de llamada segura de nuevo: test?.data?.length .

La nulabilidad se propaga a través de toda la cadena de llamadas: tiene que escribir estas cadenas como a?.b?.c?.d?.e (que es, de nuevo, equivalente a (((a?.b)?.c)?.d)?.e ), porque, si una de las partes izquierdas es nula, el rest de las llamadas no se pueden realizar como si el valor no fuera nulo.

Si no desea utilizar una llamada segura antes de cada componente que no admite nulos de la cadena de llamadas, puede get el resultado de la primera llamada segura en una nueva variable con las funciones de extensión estándar run o let :

 // `this` is non-nullable `Test` inside lambda val size = test?.run { data.length } // or: `it` is non-nullable `Test` inside lambda val size = test?.let { it.data.length } 

Tenga en count que el size sigue siendo nulable Int? aquí.

  • ¿Cómo convertir Lista << MyClass> a List <T>?
  • Usa las librerías de Javascript en Kotlin
  • Cómo mantener la reference del object de class singleton en el object complementario, Kotlin
  • Declaración de interfaz Java vs Kotlin
  • ¿Hay alguna forma de reutilizar una instancia de Job?
  • Delegar propiedad a otra propiedad
  • Error: no se encontró el procesador de annotations '__gen.AnnotationProcessorWrapper_debug_android_databinding_annotationprocessor_ProcessDataBinding'
  • Simulacro y testing de unidad un Fragmento usando Spek y Mockito
  • Cómo atrapar muchas excepciones al mismo time en Kotlin
  • ¿Cómo hago un personaje nulo en Kotlin?
  • Comportamiento de igualdad referencel de Kotlin en Int con valores entre -128 a 127