Значение 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 – его пустой

Intereting Posts
В чем разница между этими флагов компилятора Kotlin? Создание верхнего меню навигации произошел сбой при попытке использовать намерение отправлять электронную почту (Kotlin) RecyclerView не является прокручиваемым, а элементный клик не работает в recyclerview Счетчик приращений и декретов FireStore Transactions получает непоследовательный результат Как вернуть исключение зависимостей модуля в Intellij (после ложной проверки кода) Определите, является ли экземпляр экземпляром класса данных Как инициализировать поток в Котлине? Несоответствие типов. Обязательная карта <String, Any> Найдено карта <String, Any?> Как написать рекурсивные сопрограммы в котлин Android Studio 3.0 поддерживает Kotlin: активность как контекст Kotlin: Не удается вернуть производный тип Как добавить поддержку Kotlin для обычного Java Lib в Android? Круговая зависимость при компиляции с Kotlin 1.1.2-4, но не на 1.1.2-3 Нечетный размер с номером MutableList <Int> в Kotlin возвращает IndexOutOfBoundsException с итератором