casting - Kotlin स्वत: टाइप-कास्टिंग क्यों नहीं करता है?




(2)

कोट्लिन संख्यात्मक प्रकारों के अंतर्निहित रूपांतरणों की अनुमति नहीं देता है एक गलत धारणा है कि अंतर्निहित रूपांतरण " कोई नुकसान नहीं, कोई गलत नहीं " ... जो गलत है।

अंतर्निहित रूपांतरणों के लिए जावा में प्रक्रिया आपके विचार से अधिक जटिल है, डॉक्स को पढ़ने के लिए देखें कि सभी क्या शामिल हैं। और फिर आप उन सभी मामलों का विश्लेषण करने का प्रयास कर सकते हैं जो गलत हो सकते हैं।

Kotlin, संकलक आपके इरादे के रूप में अनुमान लगाने के लिए नहीं चाहता है, इसलिए यह संख्यात्मक प्रकार रूपांतरण सहित सभी भाषाओं में स्पष्ट बनाता है। जैसा स्पष्ट रूप से स्पष्ट रूप से कहता है कि स्पष्ट रूपांतरण के लिए कोटलिन डॉक्स में बताया गया है:

विभिन्न अभ्यावेदनों के कारण, छोटे प्रकार के बड़े लोगों के उपप्रकार नहीं होते हैं [...] एक परिणाम के रूप में, छोटे प्रकार परस्पर रूप से बड़े प्रकार के रूप में परिवर्तित नहीं किए जाते हैं। [...] हम संख्याओं को चौड़ा करने के लिए स्पष्ट रूपांतरण का उपयोग कर सकते हैं।

और दस्तावेज़ीकरण ऐसे एक नमूने को दिखाता है जहां चीजें गलत हो सकती हैं, लेकिन कई अन्य हैं

यहां तक ​​कि गलत टिप्पणियों और उत्तरों में उल्लिखित न ही आप एक संख्यात्मक प्रकार को दूसरे में डाल सकते हैं। यह केवल एक अच्छा रनटाइम त्रुटि का परिणाम देगा इसके बजाय संख्यात्मक रूपांतरण कार्यों जैसे toInt() और toDouble() संख्यात्मक प्रकार, जैसे नंबर क्लास पर मिलते हैं, को देखो।

चतुराई से कोटलिन व्यक्तित्व का हिस्सा है, और इसे बदलने की योजना नहीं है

var a : Double
a = Math.sin(10) // error: the integer literal does not conform to the expected type Double
a = Math.sin(10.0) //This compiles successfully
println(a)

क्यों नहीं कॉटलिन ग़ैर प्रकार के रूपांतरण को निष्पादित करता है और हमें सही प्रकार के डेटा को पारित करने के लिए मजबूर करता है?

fun sin(value: Double): Double // at kotlin documentation

संख्यात्मक प्रकारों के लिए स्वत: प्रकार की कास्टिंग सटीक खो जाने का कारण बन सकता है। बस निम्नलिखित जावा कोड पर विचार करें:

double hoursSinceUnixEra = System.currentTimeMillis()/1000/60/60;

इसका इरादा परिणाम को पूरा घंटे में कटौती नहीं करना था, यद्यपि यह जावा में बिना किसी चेतावनी के संकलन करता है।

val hoursSinceUnixEra = System.currentTimeMillis()/1000/60/60;
someObject.doubleValue = hoursSinceUnixEra

काल्पिन कोड से ऊपर काल्पनिक ढलाई के कारण संकलन नहीं होगा।

इस प्रकार के मुद्दे को खोजने और तय करने में बहुत मुश्किल हो सकती है और इस फैसले के पीछे यही कारण है। आप अभी भी स्पष्ट रूप से कनवर्ट कर सकते हैं:

val value = 3
Math.sin(value.toDouble())