¿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

  • La mejor forma de comprobar null en kotlin?
  • kotlin reflexión verificación nullable types
  • kotlin inversa boolean seguro de casting
  • ¿Cómo puedo crear una instancia de un object usando valores de parameters de constructor pnetworkingeterminados en Kotlin?
  • ¿Cómo ejecutar código si el object es nulo?
  • ¿Cómo probar idiomáticamente cadenas no nulas y no vacías en Kotlin?
  • Kotlin con si no es nulo
  • ¿Por qué la llamada insegura .run () funciona bien en un valor nulo en Kotlin?
  • Lanzamiento inteligente a kotlin.String
  • Cómo implementar lateinit correctamente con objects de class personalizados para usar en onCreate () en Android evitando el error 'Property getter or setter expected'
  • Cómo establecer la propiedad de Kotlin tardía en nulo