¿Kotlin no se puede anular valor puede ser nulo?

Tengo backend que me devuelve algo json.

Lo analizo en mi class:

class SomeData( @SerializedName("user_name") val name: String, @SerializedName("user_city") val city: String, var notNullableValue: String) 

Use la fábrica de convertidores gson:

 Retrofit retrofit = new Retrofit.Builder() .baseUrl(ENDPOINT) .client(okHttpClient) .addConverterFactory(GsonConverterFactory.create(gson)) .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .build(); 

Y en mi interfaz:

 interface MyAPI { @GET("get_data") Observable<List<SomeData>> getSomeData(); } 

Luego recupero datos del server (con rxJava) sin ningún error. Pero esperaba un error porque pensé que debería hacer algo como esto (para evitar el error del convertidor GSON, porque notNullableValue no está presente en mi respuesta JSON):

 class SomeData @JvmOverloads constructor( @SerializedName("user_name") val name: String, @SerializedName("user_city") val city: String, var notNullableValue: String = "") 

Después de que los datos se reciban de backend y se analicen en mi class SomeData con constructor sin valor de def, el valor de notNullableValue == null .

Como entiendo, ¿el valor nulo no puede ser nulo en Kotlin?

Sí, eso es porque le estás dando un valor pnetworkingeterminado. Por supuesto, nunca será nulo. Ese es el punto de un valor pnetworkingeterminado.

Remove ="" del constructor y obtendrá un error.

Editar: encontré el problema. GSON usa la class magic sun.misc.Unsafe que tiene un método allocateInstance que obviamente se considera muy unsafe porque lo que hace es initialization de omisión (constructores / inicializadores de campo y similares) y comprobaciones de security. Así que ahí está su respuesta por qué un campo Kotlin no nulo puede ser nulo. El código ofensivo está en com/google/gson/internal/ConstructorConstructor.java:223

Algunos detalles interesantes sobre la class Unsafe : http://mishadoff.com/blog/java-magic-part-4-sun-dot-misc-dot-unsafe/

Intenta anular el constructor de esta manera:

 class SomeData( @SerializedName("user_name") val name: String, @SerializedName("user_city") val city: String, var notNullableValue: String = "") { constructor() : this("","","") } 

Ahora, después de la respuesta del server, puedes verificar que notNullableValue no es nulo, está vacío

  • Kotlin Advertencia de security nula Tokens inesperados (uso; para separar expresiones en la misma línea)
  • function kotlin devuelve nulo
  • ¿Cuándo debería usar let {} y cuando simplemente! = Null
  • manejar un object que puede devolver nulo en kotlin
  • Kotlin null-check error
  • Lanzamiento inteligente a kotlin.String
  • Kotlin .let {} nulo error de security supuestamente falso
  • Requerir en la superclass 'init block plantea IllegalArgumentException
  • Kotlin security nula?
  • ¿Se puede convertir un campo en una versión no nula de sí mismo?
  • Cómo hacer comprobaciones nulas con las funciones de extensión de Kotlin en una actividad de Android