Значение Kotlin не может быть нулевым?

У меня есть backend, которые возвращают мне немного json.

Я разбираю его в своем классе:

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

Используйте gson converter factory:

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

И в моем интерфейсе:

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

Затем я получаю данные с сервера (с rxJava) без каких-либо ошибок. Но я ожидал ошибку, потому что я думал, что должен сделать что-то вроде этого (чтобы предотвратить ошибку конвертера GSON, потому что notNullableValue не присутствует в моем ответе JSON):

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

После того, как данные получены из бэкэнд и проанализированы в моем классе SomeData с конструктором без значения def, значение notNullableValue == null .

Насколько я понимаю, значение недействительного значения может быть нулевым в Котлине?

Да, это потому, что вы даете ему значение по умолчанию. Конечно, он никогда не будет нулевым. В этом весь смысл значения по умолчанию.

Remove ="" из конструктора, и вы получите сообщение об ошибке.

Изменить: обнаружена проблема. GSON использует магический класс sun.misc.Unsafe который имеет метод sun.misc.Unsafe который, очевидно, считается очень unsafe потому что он выполняет функцию инициализации пропусков (конструкторы / инициализаторы полей и т. П.) И проверки безопасности. Итак, есть ваш ответ, почему поле Kotlin с непустым значением может быть нулевым. Оскорбительный код находится в com/google/gson/internal/ConstructorConstructor.java:223

Некоторые интересные подробности о классе Unsafe : http://mishadoff.com/blog/java-magic-part-4-sun-dot-misc-dot-unsafe/

Попробуйте переопределить конструктор следующим образом:

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

Теперь после ответа сервера вы можете проверить, что notNullableValue не имеет значения null – его пустой