2015-02-05 7 views
5

मैं जावा कंपाइलर के व्यवहार से रहस्यमय हूं जब रैपर वर्ग संदर्भों को प्राइमेटिव्स निर्दिष्ट करता हूं। कृपया नीचे दिया गया कोड देखें। टिप्पणियों वाली रेखाएं संकलित नहीं होती हैं।जावा आदिम से लेकर रैपर वर्गों में कनवर्ट करना

मैं का तर्क समझ में नहीं आता क्यों:

  1. एक byte एक Byte या Short, लेकिन नहीं Integer या Long संदर्भ
  2. एक short एक Byte या Short को सौंपा जा सकता को सौंपा जा सकता , लेकिन Integer या Long संदर्भ
  3. int को Byte,पर असाइन किया जा सकता है, या Integer, लेकिन नहीं Long संदर्भ
  4. एक long एक Long को सौंपा जा सकता है, लेकिन नहीं Byte, Short या Integer संदर्भ

मैं पैटर्न नहीं देख सकता। इसमें कोई अंतर्दृष्टि वास्तव में उपयोगी होगी। धन्यवाद।

Byte s5 = (byte)7; 
Short s6 = (byte)7; 
Integer s7 = (byte)7; // Does not compile 
Long s8 = (byte)7;  // Does not compile 

Byte s9 = (short)7; 
Short s10 = (short)7; 
Integer s11 = (short)7; // Does not compile 
Long s12 = (short)7; // Does not compile 

Byte s1 = (int)7; 
Short s2 = (int)7; 
Integer s3 = (int)7; 
Long s4 = (int)7;  // Does not compile 

Byte s13 = (long)7;  // Does not compile 
Short s14 = (long)7; // Does not compile 
Integer s15 = (long)7; // Does not compile 
Long s16 = (long)7; 
+0

[जेएलएस-5.1.7। बॉक्सिंग रूपांतरण] (http://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.1.7)। –

+1

@ElliottFrisch, मैंने बस आपके द्वारा पोस्ट किए गए लिंक को देखा, लेकिन यह वास्तव में मेरे प्रश्न के बिंदु से निपटता नहीं है। – user3516726

+1

मैंने सोचा था कि आपका प्रश्न यह था कि कुछ मुक्केबाजी रूपांतरण क्यों हैं और कुछ नहीं ... कृपया * बिंदु * को स्पष्ट करें। –

उत्तर

0

मेरे शोध से, मैंने पाया कि एक बाइट 8-बिट हस्ताक्षरित पूर्णांक है। शॉर्ट्स 16-बिट हस्ताक्षरित पूर्णांक हैं। इसलिए मैं देख सकता हूं कि वे क्यों संगत हैं, वे दोनों के पूरक हस्ताक्षर पूर्णांक हैं, पर जोर पर हस्ताक्षर किए गए हैं। एक लंबा 64-बिट पूर्णांक है, लेकिन इसे भी हस्ताक्षरित किया जा सकता है (इस पर विचार करें कि इसमें हस्ताक्षर किए गए लंबे समय की तुलना करने के तरीके हैं)। यह शायद समझाएगा कि आपके रूपांतरण लंबे समय तक त्रुटियों का कारण क्यों बना रहे हैं - आप एक हस्ताक्षरित बाइट को संभावित रूप से हस्ताक्षरित लंबे समय तक कास्टिंग करेंगे। (स्रोत: http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html पर प्राइमेटिव्स के बारे में पढ़ना)

+3

हस्ताक्षर के साथ कोई समस्या नहीं है। जावा में हस्ताक्षरित प्रकार नहीं हैं, केवल कुछ उपयोगिता विधियां जो अंकगणित और तुलना करते हैं जैसे हस्ताक्षरित। – Radiodef

+0

आह क्षमा करें, मैं सी ++ से जावा तक आया था और मैं इसे भूल रहा हूं। – SirFaizdat

3

चलिए assignment context में किए गए रूपांतरणों के प्रकारों को देखें।

मुख्यतः:

  • एक पहचान रूपांतरण

  • एक चौड़ा आदिम रूपांतरण

  • एक:

    असाइनमेंट संदर्भों निम्न में से एक के उपयोग की अनुमति रेफरी चौड़ा Rence रूपांतरण

  • एक बॉक्सिंग रूपांतरण वैकल्पिक रूप से एक को चौड़ा संदर्भ रूपांतरण

  • एक unboxing रूपांतरण वैकल्पिक रूप से एक को चौड़ा आदिम रूपांतरण के बाद किया गया।

(नोट एक पर मेरे जोर।)

उदाहरण के लिए अपने उदाहरण है कि संकलन नहीं है, के अधिकांश

Integer s11 = (short)7; 

एक बॉक्सिंग रूपांतरण के बाद एक को चौड़ा आदिम रूपांतरण की आवश्यकता है। यह एक अनुमत रूपांतरण नहीं है।

लेकिन तब आप आश्चर्य हो सकता है क्यों कि निम्न उदाहरण संकलित करता है:

Byte s9 = (short)7; 

यह एक संकुचन आदिम एक बॉक्सिंग रूपांतरण के बाद रूपांतरण है।

यह एक विशेष मामला है:

इसके अलावा, अगर अभिव्यक्ति प्रकार byte, short, char की एक निरंतर अभिव्यक्ति, या int है [...] एक संकुचन आदिम रूपांतरण एक बॉक्सिंग रूपांतरण के बाद

  • Byte और निरंतर अभिव्यक्ति के मूल्य प्रकार byte में प्रदर्शनीय है: अगर चर के प्रकार है इस्तेमाल किया जा सकता है।

  • Short और निरंतर अभिव्यक्ति का मान short प्रकार में प्रदर्शित किया जा सकता है।

  • Character और निरंतर अभिव्यक्ति का मान char प्रकार में प्रदर्शित किया जा सकता है। एक पूर्णांक एक प्रकार int से संकरा का शाब्दिक व्यक्त करने के लिए कोई रास्ता नहीं है क्योंकि वहाँ

इस विशेष मामले के लिए आवश्यक है।

+0

मैं जल्दबाजी में था, और सोचा था कि 'समतुल्य' जो मैं कह रहा था उसके संदर्भ में समझा जाएगा। मैं समझता हूं कि यह एक असाइनमेंट है। – user3516726

+0

आपने इंटेगर एस 11 = (शॉर्ट) 7 के मामले की ओर इशारा किया है, जहां मुक्केबाजी के बाद एक चौड़ाई की आवश्यकता है। हां, मैं समझता हूं कि कंपाइलर को संभालने के लिए मुक्केबाजी के बाद चौड़ा होना बहुत अधिक है। हालांकि, यह स्पष्ट नहीं करता कि क्यों लघु s6 = (बाइट) 7; संकलन करता है यहां भी, मुक्केबाजी के बाद एक चौड़ाई की आवश्यकता है, लेकिन संकलक उस जुर्माना को संभालने में सक्षम प्रतीत होता है! – user3516726

+0

* "लघु s6 = (बाइट) 7" * यह मेरे उत्तर के दूसरे भाग में खंड द्वारा कवर किया गया है: * "निरंतर अभिव्यक्ति का छोटा और मान छोटा प्रकार" में प्रदर्शित होता है। – Radiodef

2

यह संकलक-विशिष्ट व्यवहार प्रतीत होता है। जब मैं आपके कोड को एक्लिप्स में पेस्ट करता हूं, जावा 7 चलाता हूं, तो मुझे short से Integer या byte से Integer पर आपके द्वारा रिपोर्ट की गई संकलक त्रुटियों को नहीं दिखाई देता है।

इसके बजाय, मैं देख रहा हूँ byte, short, और int सभी Byte, Short, और Integer करने के लिए सौंपा जा सकता है लेकिन नहीं Long, और long केवल Long को सौंपा जा सकता। दिलचस्प बात यह है कि यदि आप रैपर प्रकारों के बजाय प्राइमेटिव्स में चर बदलते हैं, byte, short, और int व्यवहार नहीं बदलता है, लेकिन अब अन्य प्रकारों से long पर असाइनमेंट भी काम करते हैं।

javac 1.7.0_02 
      | byte | Byte || short | Short || int | Integer || long | Long | 
From byte | Yes | Yes || Yes | Yes || Yes | No  || Yes | No | 
From short | Yes | Yes || Yes | Yes || Yes | No  || Yes | No | 
From int | Yes | Yes || Yes | Yes || Yes | Yes  || Yes | No | 
From long | No | No || No | No || No | No  || Yes | Yes | 

Eclipse Indigo 
      | byte | Byte || short | Short || int | Integer || long | Long | 
From byte | Yes | Yes || Yes | Yes || Yes | Yes  || Yes | No | 
From short | Yes | Yes || Yes | Yes || Yes | Yes  || Yes | No | 
From int | Yes | Yes || Yes | Yes || Yes | Yes  || Yes | No | 
From long | No | No || No | No || No | No  || Yes | Yes | 

यह देखते हुए कि विभिन्न compilers अलग रूपांतरण, मुझे लगता है "सही" व्यवहार वास्तव में JLS में लिखा हुआ नहीं है अनुमति देते हैं। ऐसा लगता है कि कुछ रूपांतरण कवर के तहत किए जाते हैं क्योंकि संकलक लेखकों ने इसे सुविधाजनक माना (उदा। byte a = (int)1 की अनुमति है लेकिन byte a = (int)1000 नहीं है), क्योंकि यह भाषा का एक दस्तावेज हिस्सा नहीं है।

+1

मुझे जावा 7 कंपाइलर का उपयोग करके ओपी के समान मिलता है। ग्रहण का मेरा संकलक मेरा मानना ​​है। – EJP

+0

@ dimo414, मैं जावा 7 का उपयोग कर रहा हूं .. मैंने दोबारा जांच की। व्यवहार बिल्कुल ठीक है जैसा मैंने अपने प्रश्न में ऊपर लिखा था। – user3516726

+0

@ user3516726 यह कंपाइलर-विशिष्ट व्यवहार प्रतीत होता है, जैसा कि ईजेपी ने उल्लेख किया है। मैंने इसे सत्यापित करने के बाद अपना जवाब अपडेट कर लिया है। – dimo414

संबंधित मुद्दे