2017-08-21 16 views
5

मेरे पास बैकएंड है जो मुझे कुछ जेसन लौटाता है।कोटलिन शून्य नहीं मूल्य शून्य हो सकता है?

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(); 
} 

तो मैं सर्वर से डेटा (पुनः प्राप्त आरएक्सजेवा के साथ) बिना किसी त्रुटि के। लेकिन मैं एक त्रुटि की उम्मीद क्योंकि मैंने सोचा (क्योंकि notNullableValue मेरी JSON उत्तर में मौजूद नहीं है GSON कनवर्टर त्रुटि को रोकने के लिए,) मैं इस तरह कुछ करना चाहिए:

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

डेटा बैकएंड से प्राप्त हुआ है और करने के लिए पार्स किया गया है के बाद मेरी डिफ वैल्यू के बिना कन्स्ट्रक्टर के साथ कुछडेटा क्लास, का मूल्य नहीं है NullableValue == null

जैसा कि मुझे समझ में आता है कि कोटलिन में शून्य नहीं हो सकता है?

+0

कृपया देखें अगर यह मदद करता है: https://stackoverflow.com/a/39963353/2196460 – hotkey

+0

इसके समझाने कन्स्ट्रक्टर में डीफ़ वैल्यू के साथ स्थिति। लेकिन मेरी स्थिति में मेरे पास मूल्य मान नहीं है। – jQuick

+0

बनाया गया के बाद जीसन द्वारा 'notNullableValue' बदल दिया गया था। क्योंकि यह 'var'' val' नहीं है। –

उत्तर

9

हां, ऐसा इसलिए है क्योंकि आप इसे डिफ़ॉल्ट मान दे रहे हैं। यह कभी भी शून्य नहीं होगा। यह एक डिफ़ॉल्ट मान का पूरा बिंदु है।

कन्स्ट्रक्टर से ="" निकालें और आपको एक त्रुटि मिलेगी।

संपादित करें: समस्या मिली। GSON जादू sun.misc.Unsafe वर्ग है जो एक allocateInstance विधि क्योंकि उसके द्वारा छोड़ प्रारंभ (कंस्ट्रक्टर्स/क्षेत्र initializers और की तरह) और सुरक्षा जांच है जो स्पष्ट रूप से बहुत unsafe माना जाता है का उपयोग करता है। तो आपका जवाब है कि क्यों एक कोटलिन गैर-शून्य क्षेत्र शून्य हो सकता है। http://mishadoff.com/blog/java-magic-part-4-sun-dot-misc-dot-unsafe/

+0

नहीं, जैसा कि आप सही काम पढ़ते हैं ठीक बिना = ""। और notNullableValue == शून्य – jQuick

+0

मुझे गलतफहमी के लिए खेद है, मैं प्रश्न संपादित कर रहा हूं। – jQuick

+0

@jQuick मैंने अपना जवाब अपडेट किया। टीएलडीआर: जीसन असुरक्षित जावा जादू कक्षाओं का उपयोग कर रहा है। – Strelok

0

कोशिश इस तरह निर्माता ओवरराइड करने के लिए: अपमानजनक कोड com/google/gson/internal/ConstructorConstructor.java:223

Unsafe वर्ग के बारे में कुछ रोचक विवरण में है

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

अब सर्वर प्रतिक्रिया के बाद आप जाँच कर सकते हैं notNullableValue रिक्त नहीं है - अपने खाली

संबंधित मुद्दे