किसी भी विचार क्यों मैं यहाँ (int) के लिए एक पूर्णांक शाब्दिक कास्ट करने की आवश्यकता है?


122

निम्नलिखित उदाहरण में

int i = -128;
Integer i2 = (Integer) i; // compiles

Integer i3 = (Integer) -128; /*** Doesn't compile ***/

Integer i4 = (Integer) (int) -128; // compiles
Integer i4 = -128; // compiles
Integer i5 = (int) -128; // compiles
Integer i6 = (Integer) (-128); // compiles
Integer i7 = (Integer) 0-128; // compiles

मैं -128साथ नहीं डाल सकता (Integer)लेकिन मैं कास्ट कर सकता हूं (int) -128

मैं हमेशा सोचता -128था कि intयह टाइप का है और इसके साथ कास्टिंग (int)करना बेमानी होना चाहिए।

के साथ लाइन पर त्रुटि i3है

cannot find symbol variable Integer

मैंने जावा 6 अपडेट 29 और जावा 7 अपडेट 1 के साथ यह कोशिश की।

संपादित करें: आप के साथ समान व्यवहार प्राप्त +128करने के बजाय -128। यह यूनरी और बाइनरी ऑपरेटरों के बीच भ्रम की स्थिति प्रतीत होती है।


5
आपका कंपाइलर क्या है? Integer i = -128;हालांकि यह संकलन करना चाहिए।
बेस्टसेल्स

Integer i3 = (Integer) (-128);यद्यपि , अनुपालन होता है।
Eng.Fouad

2
@ Eng.Fouad, Peter, unary Symbol (+ -) के पास बाएँ से बाएँ समरूपता है और साथ ही, ऋण को दाएँ से बाएँ छोड़ा जाता है। -128 का प्रभाव +128 के समान होगा और 0 को सामने रखकर निश्चित करना चाहिए, अर्थात 0-128 या 0 + 128। (नहीं कर सकते परीक्षण एटीएम लेकिन मुझे यकीन है कि यह होगा)
bestsss

अच्छा प्रश्न! मैं व्यक्तिगत रूप से यूआरआई / बाइनरी ऑपरेटरों के संकल्प के लिए एक जेएलएस संदर्भ देखना चाहता हूं और जब एक कलाकार को अभिव्यक्ति के रूप में माना जाता है। अन्यथा, यह संभव हो सकता है कि अन्य संकलक इसे त्रुटि नहीं मानते हैं!
ब्रिंजर128

1
इसके अलावा FYI करने पर मुझे अपनी IDE में जो त्रुटि मिलती है Expression expectedवह Integerहै।
ब्रिंजर128

जवाबों:


151

संकलक कास्टिंग के बजाय 128से घटाना करने की कोशिश करता है । इसे ठीक करने के लिए जोड़ें(Integer)-128Integer()

Integer i3 = (Integer) -128; // doesn't compile
Integer i3 = (Integer) (-128); // compiles

टिप्पणियों के अनुसार बोल्टकॉक के अनुसार कलाकारों को intइच्छित कार्य करने के लिए, क्योंकि यह एक आरक्षित शब्द है और इसलिए इसे एक पहचानकर्ता के रूप में व्याख्या नहीं किया जा सकता है, जो मुझे समझ में आता है।

और Bringer128 ने JLS संदर्भ 15.16 पाया ।

 CastExpression:
    (प्रिमिटिव टाइप डीम्स ऑप्ट ) UnaryExpression
    (संदर्भप्रकार) UnaryExpressionNotPlusMinus

जैसा कि आप देख सकते हैं, आदिम प्रकार के लिए UnaryExpressionकास्टिंग किसी भी आवश्यकता है , जबकि एक संदर्भ प्रकार के लिए कास्टिंग की आवश्यकता है एक UnaryExpressionNotPlusMinus। इन्हें JLS 15.15 पर कास्ट एक्सप्रेशन से ठीक पहले परिभाषित किया गया है ।


31
मुझे लगता है कि यह intजावा में एक कीवर्ड है, लेकिन Integerऐसा नहीं है। चूंकि intएक कीवर्ड है, आप इसे एक चर या वर्ग के लिए एक पहचानकर्ता के रूप में उपयोग नहीं कर सकते हैं, जिससे टाइपकास्ट होने की एकमात्र संभावना बची है। वह इसे स्पष्ट करेगा।
BoltClock

@BoltClock उत्तर में अपनी टिप्पणी शामिल करें।
जेन्स स्काउडर

3
इसे और भी शानदार उत्तर देने के लिए, क्या आप मेरे लिंक को JLS से जोड़ना चाहते हैं?
ब्रिंजर128

3
इस मुद्दे पर एक दिलचस्प (मेरे लिए) शिकन है कि हम C # में समसामयिक समस्या को कैसे हल करते हैं, जो "द्विआधारी घटाव ऑपरेटर के लिए एक ऑपरेंड के रूप में संक्षिप्त अभिव्यक्ति" और "कास्ट ऑपरेटर" के बीच व्याकरण में एक अस्पष्टता भी है जहां सही ऑपरेटर कास्ट एक अनैतिक माइनस अभिव्यक्ति है ”। सी # विनिर्देश की धारा 7.7.6 देखें कि हम जिस विशालकाय आंकड़े का उपयोग करने की कोशिश कर रहे हैं, उसके बारे में विस्तार से बताने के लिए और स्मार्टता का उपयोग करें।
एरिक लिपर्ट

1
@BillK आप ऐसा क्यों कहते हैं? सी # कल्पना सेक्शन 7.7.6 में ऑपरेटर के ओवरलोडिंग का उल्लेख नहीं करता है, इसलिए यह उनके लिए कोई समस्या नहीं थी।
ब्रिंजर128

48

मुझे JLS संदर्भ मिला। 15.16

 CastExpression:
    (प्रिमिटिव टाइप डीम्स ऑप्ट ) UnaryExpression
    (संदर्भप्रकार) UnaryExpressionNotPlusMinus

जैसा कि आप देख सकते हैं, आदिम प्रकार के लिए UnaryExpressionकास्टिंग किसी भी आवश्यकता है , जबकि एक संदर्भ प्रकार के लिए कास्टिंग की आवश्यकता है एक UnaryExpressionNotPlusMinus। इन्हें JLS 15.15 पर कास्ट एक्सप्रेशन से ठीक पहले परिभाषित किया गया है ।

आपको या तो कलाकारों को एक आदिम प्रकार में बदलना होगा:

... (int) -128;

या आप कास्ट के दाईं ओर अभिव्यक्ति को गैर-प्लस-माइनस गैरी अभिव्यक्ति में बदल सकते हैं:

... (Integer) (-128);  // Either
... (Integer) 0 - 128; // Or

12

कंपाइलर -दो-आरजी माइनस ऑपरेटर के रूप में व्याख्या करता है , अर्थात यह नामांकित किसी अन्य संख्या से 128 को घटाने की कोशिश कर रहा है Integer, लेकिन इस तरह का कोई भी स्कोप नहीं है।

यह संकलन:

Integer i3 = (Integer) (-128)

आप इस पर टिप्पणी जोड़ सकते हैं कि (int)अंतर क्यों पड़ता है।
पीटर लॉरी

1
यह ऑटोबॉक्सिंग के कारण है, नहीं?
ब्रायन रोच

9

यह सिंटैक्स पार्सिंग के साथ करना पड़ सकता है। नोटिस जो

Integer i4 = (Integer) (-128); 

ठीक काम करता है।

सामान्य तौर पर, आपको इंटेगर क्लास में नहीं जाना चाहिए। इसमें ऑटो-बॉक्सिंग नामक कुछ चीजें शामिल हैं, और आपके कोड में कुछ सूक्ष्म त्रुटियां हो सकती हैं। आप जो चाहते हैं वह करने का पसंदीदा तरीका है:

Integer i6 = Integer.valueOf(-128)

1
इंटेगर को कास्ट मूल्य के लिए बिल्कुल सिंथेटिक चीनी है।
बेस्टसेन्स

4
हाँ, लेकिन कभी-कभी सिंथेटिक चीनी सूक्ष्म तरीकों से विफल हो जाती है। मुझे ऑटो-बॉक्सिंग के कारण बड़े अनुप्रयोगों में अशक्त सूचक अपवादों को ट्रैक करने में थोड़ी मुश्किल हुई है। हम भविष्य में सिरदर्द से बचाने के लिए ऑटो-बॉक्सिंग को त्रुटियों के रूप में मानते हैं। जादू अच्छा है, लेकिन जब यह विफल होता है, तो सिर पर चोट लगती है। मुझे लगता है कि स्पष्ट होना बेहतर है और खुद को सिरदर्द से बचाना है।
क्रिस्टियन साइबुलस्की

NPE b1tch w / आउटबॉक्सिंग, सच है। for (int i in Collection<Integer>)बी / सी एनपीई जैसे एस्प के मामले बिल्कुल अप्रत्याशित स्थान पर हैं। मैं वास्तव में Integer w / autoboxing का उपयोग नहीं करता हूं क्योंकि कैश रेंज छोटी है (यद्यपि इसे w / XX विकल्प बढ़ाया जा सकता है) लेकिन बहुत समान सामान करने के लिए IntegerProvider (1.1 के बाद से) नामक एक वर्ग है। मैप का उपयोग करना (java.util में से कोई भी) Integer-> कुछ भी आमतौर पर एक प्रदर्शन हिट होता है जब तक कि यह तुच्छ मामलों के लिए उपयोग नहीं किया जाता है और लगभग हमेशा एक बेहतर समाधान होता है।
बेस्ट

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

@ मेटबॉल, मुझे यह बिल्कुल पसंद नहीं है, सिंथेटिक चीनी का व्यापक रूप से उपयोग किया जाता है: eggcorns.lascribe.net/forum/viewtopic.php?id=4400 और सिंथेटिक ध्वनियां मेरे लिए बेहतर हैं।
bestsss

9

यह इसे पार्स कर रहा है Integer <minus operator> 128और चर नहीं पा रहा है Integer। आपको -128कोष्ठक में लपेटना होगा :

Integer i3 = (Integer) (-128);  // compiles

मैं सभी अन्य उत्तर करने के लिए +1 से सम्मानित किया गया है क्योंकि वे सब सही भी :) रहे
बोहेमियन

7
Integer i3 = (Integer) (-128);

समस्या यह है कि -संकलक इसे एक ऑपरेटर के रूप में देखता है।


6

पंक्ति 3 की व्याख्या इस तरह की जाती है कि आप कोष्ठक में अभिव्यक्ति से 128 घटाने की कोशिश कर रहे हैं और कोष्ठक में अभिव्यक्ति नहीं है और टाइप इंट की अभिव्यक्ति नहीं है (यह '-' को '-' संचालक के रूप में मानता है)। यदि आप अभिव्यक्ति को इसमें बदलते हैं:

Integer i3 = (Integer) (-128);

तब संकलक समझ जाएगा कि '-' एक शून्य है जो ऋणात्मक पूर्णांक इंगित करता है।


3

C # कंपाइलर का व्यवहार समान होता है। यह एक बेहतर संकेत देता है कि यह संकलन करने में विफल क्यों है:

एक नकारात्मक मूल्य डालने के लिए, आपको कोष्ठक में मान संलग्न करना होगा

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