2017-08-21 16 views
5

私にバックスンが戻ってきました。nullではなくnull値はnullにできますか?

私は私のクラスにそれを解析:

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

使用gsonコンバータ工場:

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で)エラーなし。データがバックエンドから受け取ったと私に解析された後

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

:私はこれ(notNullableValueが私のJSONレスポンスに存在しないため、GSONコンバータエラーを回避するための)ような何かをしなければならないと思ったので、しかし、私はエラーを予想しましたSomeDataクラスはdef値を持たないコンストラクタを持ち、の値はnotNullableValue == nullです。

私はnullableでないことを理解しているので、Kotlinではnullにすることができますか?

+0

これが役立つかどうかを確認してください:https://stackoverflow.com/a/39963353/2196460 – hotkey

+0

説明コンストラクタでdef値を持つ状況。しかし、私の状況では私はdef値を持っていません。 – jQuick

+0

'notNullableValue'は作成後にgsonによって変更されました。それは 'val'ではなく' var'であるからです。 –

答えて

9

はい、これはデフォルト値を指定しているためです。もちろん、それは決してnullにはなりません。これがデフォルト値の全体のポイントです。

コンストラクタから=""を削除すると、エラーが発生します。

編集:問題が見つかりました。 GSONは、allocateInstanceメソッドを持つ魔法のsun.misc.Unsafeクラスを使用しています。これは、スキップ初期化(コンストラクタ/フィールドイニシャライザなど)とセキュリティチェックが原因で、明らかに非常にunsafeと考えられます。したがって、Kotlinのnullableではないフィールドがnullになる可能性があるあなたの答えがあります。問題のあるコードはcom/google/gson/internal/ConstructorConstructor.java:223

Unsafeクラスに関するいくつかの興味深いの詳細です:http://mishadoff.com/blog/java-magic-part-4-sun-dot-misc-dot-unsafe/

+0

いいえ、あなたが正しいものを読むと、すべて正常に動作します= ""なし。そしてnotNullableValue == null – jQuick

+0

私は誤解をおかけして申し訳ありません、私は編集の質問です。 – jQuick

+0

@jQuick私は自分の答えを更新しました。 TLDR:Gsonは安全でないJavaのマジッククラスを使用しています。 – Strelok

0

このようなコンストラクタ上書きするようにしてください:今すぐ

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

をサーバの応答の後にあなたがnotNullableValueがnullでない確認することができます - 空欄

関連する問題