java - कोई विचार क्यों मुझे(इंट) के लिए एक पूर्णांक डालने की आवश्यकता है?




syntax casting (6)

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

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

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

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

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

cannot find symbol variable Integer

मैंने इसे जावा 6 अपडेट 2 9 और जावा 7 अपडेट 1 के साथ करने की कोशिश की

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


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

यह संकलित:

Integer i3 = (Integer) (-128)

मैंने जेएलएस संदर्भ पाया 15.16

 CastExpression:
    ( PrimitiveType Dimsopt ) UnaryExpression
    ( ReferenceType ) UnaryExpressionNotPlusMinus

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

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

... (int) -128;

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

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

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

Integer i4 = (Integer) (-128); 

सिर्फ ठीक काम करता है

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

Integer i6 = Integer.valueOf(-128)

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

Integer i3 = (Integer) (-128);

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


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

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


Integer i3 = (Integer) (-128);

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







casting