2016-08-18 9 views
5

Kotlin documentation पृष्ठ से:क्या आप सी # कोड के संदर्भ में कोड के इस टुकड़े को समझा सकते हैं?

// public final class Gson { 
//  ... 
//  public <T> T fromJson(JsonElement json, 
//       Class<T> classOfT) 
//       throws JsonSyntaxException { 
//  ... 

ऊपर कोड स्निपेट में, मुझे लगता है कि Class<T> बात के अलावा सब कुछ समझते हैं। मुझे लगता है यह निम्न में से सी # बराबर है:

public sealed class Gson 
{ 
    public T FromJson<T>(JsonElement json, 
         System.Type Type) 
    { 
    } 
} 

और ग्राहक कोड कुछ ऐसा कहना होगा:

var gson = new Gson(); 
var customer = gson.FromJson<Customer>(json, typeof(Customer)); 

लेकिन मुझे यकीन है क्योंकि है कि पूरे System.Type पैरामीटर में अनावश्यक प्रतीत नहीं हो सकता विधि परिभाषा में सामान्य प्रकार पैरामीटर T का चेहरा।

इसके अलावा, उस पृष्ठ पर एक ही स्थान पर, class.java क्या है निम्न स्निपेट में?

inline fun <reified T: Any> Gson.fromJson(json): 
       T = this.fromJson(json, T::class.java) 

मुझे लगता है कि जावा में वर्ग ClassSystem.Type इसलिए यदि आप कहते हैं, typeof(Customer) चाहता था के समान है, आप Customer.class कहेंगे? क्या वो सही है?

class.java क्या है?

+0

जावा जेनेरिक प्रकार रनटाइम पर उपलब्ध नहीं हैं। यदि विधि को उन्हें जानने की आवश्यकता है तो आपको उन्हें पैरामीटर के रूप में पास करना होगा। और 'class.java' एक अच्छी तरह से प्रलेखित कोटलिन संगतता निर्माण है। – chrylis

+0

क्लास ऑब्जेक्ट (java.lang.Class) क्या है? [Http://stackoverflow.com/questions/4453349/what-is-the-class-object-java-lang-class) –

+1

@ संभावित डुप्लिकेट AndreasBrunnet एक प्रासंगिक डुप्लिकेट नहीं है; सवाल जेनेरिक मिरर के बारे में है। – chrylis

उत्तर

7

जावा जेनेरिक प्रकार मिटा: वास्तविक प्रकार T रनटाइम पर कोड के लिए उपलब्ध नहीं है। चूंकि जीसन को यह जानने की जरूरत है कि लक्षित deserialization प्रकार क्या है, Class<T> गुजरने से स्पष्ट रूप से इसकी पहचान होती है।

दूसरी ओर, कोटलिन के पास जावा की तुलना में कुछ मजबूत प्रकार की प्रणाली है, और चूंकि फ़ंक्शन में रेखांकित किया गया है, इसलिए संकलक जानता है कि जेनेरिक प्रकार वास्तव में क्या है (reified कीवर्ड)। निर्माण T::class.java कोटलिन कंपाइलर को यह निर्धारित करने के लिए बताता है कि उपयुक्त प्रकार T क्या है और फिर T के क्लास संदर्भ को रेखांकित करता है।

यह इनलाइन पुनर्वितरण अनिवार्य रूप से कोटलिन के लिए सिंटैक्टिक चीनी है, जिससे कोटलिन उपयोगकर्ता गंतव्य प्रकार के हार्डकोडेड विनिर्देश को संकलक के अनुमान में प्रस्तुत करने की अनुमति देते हैं।

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