कोटलिन में एकल विस्मयादिबोधक चिह्न


141

कोटलिन में एकल विस्मयादिबोधक चिह्न का क्या अर्थ है? मैंने इसे विशेष रूप से जावा एपीआई का उपयोग करते समय कुछ बार देखा है। लेकिन मैं इसे डॉक्यूमेंटेशन में नहीं ढूंढ सका और न ही StackOverflow पर।

जवाबों:


155

उन्हें प्लेटफ़ॉर्म प्रकार कहा जाता है और उनका मतलब है कि कोटलिन को यह पता नहीं है कि वह मूल्य हो सकता है या नहीं nullऔर यह आपको तय करना है कि यह अशक्त है या नहीं।

संक्षेप में, समस्या यह है कि जावा से आने वाला कोई भी संदर्भ अशक्त हो सकता है, और कोटलिन, डिजाइन द्वारा शून्य-सुरक्षित होने के कारण, उपयोगकर्ता को हर जावा मान की जांच करने के लिए मजबूर करता है, या सुरक्षित कॉल ( ?.) या नहीं-शून्य का उपयोग करता है !!)। शुद्ध कोटलिन दुनिया में बहुत काम की विशेषताएं होने के कारण, एक आपदा में बदल जाते हैं जब आपको उन्हें अक्सर कोटलिन या जावा सेटिंग में उपयोग करना पड़ता है।

यही कारण है कि हमने एक कट्टरपंथी दृष्टिकोण अपनाया और जब जावा इंटरॉप की बात आती है तो कोटलिन के प्रकार प्रणाली को और अधिक आराम दिया: अब जावा से आने वाले संदर्भों में विशेष रूप से चिह्नित प्रकार हैं - कोटलीन ब्लॉग


2
Thats सभी ने कहा और किया अच्छा है। हालाँकि, मैं इसे कॉल करने में अच्छा महसूस नहीं कर रहा हूंplatform types
JaydeepW

61

यह प्लेटफ़ॉर्म प्रकारों के लिए अंकन है :

T!मतलब " Tया T?"


क्यों नहीं T" T!या T?"
Arst

टी! गैर-अशक्त का मतलब है, टी? का मतलब है अशक्त। कोटलिन ऐसा क्यों नहीं करता ...
Arst

4
क्योंकि स्पष्ट कारणों के लिए सबसे अच्छा डिफ़ॉल्ट "गैर-अशक्त" है, और यह डिफ़ॉल्ट के लिए सबसे छोटा प्रकार का हस्ताक्षर है। इस प्रकार T"गैर-अशक्त" बना दिया गया था, और बाकी कमोबेश मनमाना था
वोड्डन

13

एक टाइप नोटिफ़ाइड को प्लेटफ़ॉर्म प्रकार! कहा जाता है , जो कि जावा से आने वाला एक प्रकार है और इस प्रकार संभवतः हो सकता है null। जावा को कॉल करते समय यह डिफ़ॉल्ट रूप से कोटलिन कंपाइलर होता है (सबसे बुनियादी मामलों के लिए, जावा विधियों को लगभग प्राप्त करने के लिए एनोटेट किया जा सकता है )। आपको प्लेटफ़ॉर्म प्रकारों को अशक्त प्रकारों के रूप में संभालना चाहिए , जब तक कि आप निश्चित रूप से नहीं जानते हैं कि विशेष एपीआई कभी वापस नहीं आएगा null। संकलक प्लेटफ़ॉर्म प्रकारों को अशक्त और गैर-अशक्त दोनों प्रकारों के चर को असाइन करने की अनुमति देता है।

प्लेटफ़ॉर्म प्रकार के लिए अधिसूचना

[...]

T!का अर्थ है " T or T?" [...]

आप प्लेटफ़ॉर्म प्रकारों को " अज्ञात अशक्तता के प्रकार" के रूप में संदर्भित कर सकते हैं । यह जानना भी महत्वपूर्ण है कि आप अपने स्वयं के प्रकारों के लिए विस्मयादिबोधक-प्रकार का उपयोग नहीं कर सकते हैं, यह कोटलिन सिंटैक्स का हिस्सा नहीं है, यह केवल एक संकेतन है


वाक्यांश जैसे 'शायद सबसे ज्यादा' मदद नहीं करते हैं
इवान

9

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

उदाहरण के लिए:

अशक्त जानकारी: अशक्त प्रकार

@Nullable Stringजावा में String?कोटलिन द्वारा माना जाता है।

गैर-शून्य जानकारी: गैर-शून्य प्रकार

@NotNull Stringजावा में Stringकोटलिन द्वारा माना जाता है।

कोई जानकारी नहीं: प्लेटफ़ॉर्म प्रकार

Stringजावा में एनोटेशन String!कोटलिन द्वारा माना जाता है।


प्लेटफ़ॉर्म प्रकार से कैसे निपटें?

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

ध्यान दें कि आप कोटलिन कोड में प्लेटफ़ॉर्म प्रकारों की घोषणा नहीं कर सकते, वे केवल जावा कोड से आते हैं।


वंशानुक्रम और प्लेटफ़ॉर्म प्रकार

कोटलिन कोड में जावा विधियों को ओवरराइड करते समय, आपके पास मापदंडों को घोषित करने और अशक्त या गैर-अशक्त के रूप में वापस लौटने का विकल्प होता है। आपको इसे बुद्धिमानी से चुनने की आवश्यकता है, क्योंकि यदि आप मापदंडों को गैर-अशक्त बनाने का निर्णय लेते हैं, तो कोटलिन कंपाइलर इन गैर-शून्य मापदंडों के लिए गैर-शून्य अभिकथन उत्पन्न करता है। और जब अगली बार आप इस कोटलिन कोड को जावा से वापस एक्सेस करते हैं और आप एक शून्य मान पास करते हैं, तो आपको अपवाद मिलेगा।

आशा है कि प्लेटफ़ॉर्म प्रकारों के बारे में आपके सभी संदेहों को दूर करने में मदद करता है।


3

मैंने इसे विशेष रूप से जावा एपीआई का उपयोग करते समय कुछ बार देखा है

जैसा कि s1m0nw1 द्वारा उल्लेख किया गया है, का T!मतलब है T or T?। अगला सवाल है: क्या है T?? यह अच्छी तरह से https://kotlinlang.org/docs/reference/null-safety.html पर प्रलेखित है । Kotlin कुछ तत्वों होने की अनुमति नहीं है null, उदाहरण के लिए String, जावा के विपरीत

नल की अनुमति देने के लिए, हम एक चर को अशक्त स्ट्रिंग के रूप में घोषित कर सकते हैं, स्ट्रिंग लिखा है ?:

var b: String? = "abc"
b = null // ok

[...]

b?.length 

यह b.length देता है यदि b अशक्त नहीं है, और अन्यथा शून्य है। इस अभिव्यक्ति का प्रकार है Int?


0

कोटलिन में प्लेटफ़ॉर्म प्रकार से उद्धरण :

एक प्रकार को वैकल्पिक रूप से निर्दिष्ट करने के अलावा (उदाहरण के लिए Person?), कोटलिन हमें एक अन्य जानवर के साथ प्रस्तुत करता है, जिसे Platform Typeएक एकल विस्मयादिबोधक चिह्न लगाकर निर्दिष्ट किया जाता है (जैसे Person!)। यह अवधारणा संगतता कारणों के लिए बनाई गई है, जब जावा जैसे अशक्त-असुरक्षित प्लेटफार्मों से कोड तक पहुंच है। यह अक्सर ऐसा होता है कि जब जावा लाइब्रेरी का उपयोग करते हैं, तो कई तरीके वापस आ जाते हैं SomeType!, क्योंकि परिणाम नगण्य है या नहीं, तो कोटलिन कंपाइलर का पता नहीं चल सकता है।

उदाहरण के लिए:

(Mutable)Collection<T>! 

बस निम्नलिखित का अर्थ है: " टी का जावा संग्रह परस्पर हो सकता है या नहीं, अशक्त हो सकता है या नहीं "।

उम्मीद है की यह मदद करेगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.