_ (अंडरस्कोर) एक आरक्षित कीवर्ड है


92

मैंने sनिम्नलिखित लैम्बडा एक्सप्रेशन को निम्नलिखित में बदल दिया है _:

s -> Integer.parseInt(s)

ग्रहण संकलक कहते हैं:

'_' को पहचानकर्ता के रूप में उपयोग नहीं किया जाना चाहिए, क्योंकि यह स्रोत स्तर 1.8 से एक आरक्षित कीवर्ड है।

मुझे JLS found3.9 लेक्सिकल स्ट्रक्चर / कीवर्ड में कोई स्पष्टीकरण नहीं मिला है ।

जवाबों:


83

देखने का स्थान JLS §15.27.1 है। लंबोदर पैरामीटर्स

यह एक संकलित समय त्रुटि है अगर एक लैम्ब्डा पैरामीटर का नाम _ है (जो कि एकल अंडरस्कोर वर्ण है)।

किसी भी संदर्भ में चर नाम _ का उपयोग हतोत्साहित किया जाता है। जावा प्रोग्रामिंग भाषा के भविष्य के संस्करण इस नाम को एक कीवर्ड के रूप में आरक्षित कर सकते हैं और / या इसे विशेष शब्दार्थ दे सकते हैं।

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


21
ध्यान दें कि जावा 9 के रूप में, _किसी भी कानूनी पहचानकर्ता के नाम के रूप में और न केवल एक लंबोर्ड पैरामीटर नाम के रूप में अस्वीकृत किया जाएगा। यह वास्तव में 43 के निर्माण में तय किया गया था: Bugs.openjdk.java.net/browse/JDK-8061549
जीन-फ्रांस्वा

3
@lscoughlin: "जावा प्रोग्रामिंग लैंग्वेज के भविष्य के संस्करण इस नाम को एक कीवर्ड के रूप में आरक्षित कर सकते हैं और / या इसे विशेष शब्दार्थ" दे सकते हैं? खैर, "का उपयोग करेंगे" द्वारा "आरक्षित कर सकते हैं" बदलें, और आप चित्र प्राप्त करेंगे। हो सकता है कि यह मेल संदर्भ मदद करता हो ...
होल्गर

5
यह क्या है? जावा पीछे की संगतता को तोड़ रहा है?
आर्टुरो टॉरेस सांचेज़

8
@ ऑर्टो टॉरेस सेंचेज: यह कोई नई बात नहीं है। कई बार enumऔर assertथे कानूनी पहचानकर्ता ...
होल्गर

11
@ होलगर वास्तव में ऐसी कई भाषाएं हैं जो अंडरस्कोर का उपयोग एक नाम प्लेसहोल्डर (स्काला, क्लोजर, एफ #, एसएमएल, एर्लांग के रूप में करती हैं, केवल कुछ नाम के लिए)। यह एक स्थापित पैटर्न है जो 90 या 80 के दशक का है, मुझे विश्वास है, इसलिए यह अवज्ञा विषम है।
ओम-नॉम-नॉम-जुले

23

यह JEP 302 का चरण 2 है , जो लंबोदर अभिव्यक्तियों में अप्रयुक्त मापदंडों को निरूपित करने के लिए एक विशेष चरित्र के रूप में अंडरस्कोर जोड़ने जा रहा है।

अंडरस्कोर का उपचार

कई भाषाओं में, एक अंडरस्कोर का उपयोग करना आम है (_ एक अनाम लंबर पैरामीटर (और इसी तरह विधि और अपवाद मापदंडों के लिए) को निरूपित ) :

BiFunction<Integer, String, String> biss = (i, _) -> String.valueOf(i);

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


1
इस प्रयोग की चर्चा ब्रायन गोएत्ज़ ने 2017-11 के प्रोजेक्ट एम्बर के बारे में अपने डेक्सॉक्स चर्चा में की है
बेसिल बॉर्क

ठीक है, लेकिन जे 8 में अप्रयुक्त मापदंडों को निरूपित करने का विकल्प क्या है? क्या यह बिल्कुल भी संभव नहीं है?
मैनुअल

1
हम वर्तमान में $इस उद्देश्य के लिए उपयोग करते हैं।
aventurin

मैं अभी जावा 14 पर हूं, और मैं अभी भी एक अनाम लैम्बडा पैरामीटर के रूप में अंडरस्कोर का उपयोग नहीं कर सकता हूं। जेसीपी को प्राप्त करने के लिए जो भी निर्धारित किया गया है, यह प्रतीत होता है कि उन्होंने विपरीत हासिल किया है।
फर्स

@Frans ध्यान दें कि JEP (आज के अनुसार) केवल उम्मीदवार चरण में है। यह अभी तक पूरा नहीं हुआ है। JEP प्रक्रिया के बारे में अधिक जानकारी के लिए JEP 1
अलेक्जेंड्रे डी चंपकॉ

5

जावा SE 9 के लिए जावा भाषा परिवर्तन https://docs.oracle.com/javase/9/language/toc.htm#JSLAN-GUID-16A5183A-DC0D-4A96-B9D8-AAC9671222DD

जावा 9 से, _ चरित्र का उपयोग पहचानकर्ता के रूप में नहीं किया जा सकता है, न कि केवल लंबोदर संदर्भ में

अंडरस्कोर वर्ण एक कानूनी नाम नहीं है।

यदि आप पहचानकर्ता अंडरस्कोर वर्ण ("_") का उपयोग करते हैं, तो आपका स्रोत कोड संकलित नहीं किया जा सकता है।

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