2010-09-09 22 views
5

मैं समझता हूँ कि निम्नलिखित कोडAutoboxing/widening शॉर्ट ए = 3 में होता है लेकिन फ्लोट ए = 3 में नहीं होता है;

Float a=3 

क्योंकि काम नहीं करेगा अपने फ्लोट एक = Integer.valueOf के रूप में अनुवाद (3)। हमारे पास एलएचएस पर एक फ्लोट संदर्भ होगा और आरएचएस पर एक इंटेजर ऑब्जेक्ट होगा, जो असंगत है। लेकिन:

1.

 `Short a=3;` 

यह काम करता है, हालांकि यहाँ फिर से, हम एलएचएस और आरएचएस पर एक पूर्णांक वस्तु पर एक लघु संदर्भ होगा।

2.

Float a=(Float) 3

हम 3 typecasted नहीं किया था, तो यह Integer.valueOf के रूप में अनुवाद किया गया है | (3)। अब, इसका अनुवाद Float.valueOf (3) के रूप में किया जाएगा?

+0

आप एक जावा संकलक है? यदि ऐसा है, तो आप इसे आजमा सकते हैं। – DJClayworth

उत्तर

0

यदि आप किसी वैरिएबल को वैल्यू के साथ शुरू करने की कोशिश करते हैं, तो यह मान सकता है (मान के संख्यात्मक रूप के बावजूद), कंपाइलर आपको एक त्रुटि संदेश देगा। उपरोक्त कोड में

char c = 0xffff; // max char hex value 
byte b = 0x7f; // max byte hex value 
short s = 0x7fff; // max short hex value 

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

तो आपके मामले में Short s = 3 वास्तव में Short s = new Short(3) बन जाता है और काम करता है।

दूसरे मामले में Float a=(Float) 3Float.valueOf(3)

हो जाएगा (valueOf तरीकों जब autoboxing यही वजह है कि आधुनिक IDEs झंडा करने के लिए विकल्पों इन त्रुटियों के रूप में autoboxing है और हम स्मृति के बेहतर प्रबंधन पहले के लिए valueOf विधि के साथ उन्हें जगह ले सकता है के लिए इस्तेमाल नहीं कर रहे हैं)
+0

धन्यवाद। बहुत साफ़। क्या आप तब पुष्टि कर सकते हैं कि "फ्लोट ए = 3 काम नहीं करेगा क्योंकि जावा ऑटोबॉक्सिंग द्वारा निम्नलिखित चौड़ाई को अनुमति नहीं देता है"। इसके अलावा, ऑटोबॉक्सिंग का मतलब यह नहीं है कि उचित रैपर कन्स्ट्रक्टर को एलएचएस के लिए बुलाया जाता है। यदि यह मामला था, तो फ्लोट ए = 3 काम करता। क्या हो रहा है कि ऑटोबॉक्सिंग से पहले, प्राचीन प्रकार को रैपर के आदिम प्रकार के समान बनाने के लिए एक संकीर्ण रूपांतरण होना चाहिए और फिर केवल ऑटोबॉक्सिंग होगी। क्या मैं यहाँ हूँ? – Daud

1

संक्षिप्त रूप है:

Float a=3.0f; 

डबल प्रकार के लिए:

Double b=3.0; 
2

अपने प्रश्न "है क्यों फ्लोट च = 3 है; संकलन नहीं है, लेकिन कम रों = 3; करता है? ", तो जवाब है:

जावा कंपाइलर बाएं हाथ के साथ फिट करने के लिए पूर्णांक स्थिरांक पर कुछ विशेष कार्य करता है: यह सबसे उपयुक्त प्रकार पाता है और इसका उपयोग करता है। तो,

Short s = 3; 

Short s = Short.valueOf(3); 

को संकलित किया गया है अनिवार्य रूप से, एक ही जादू होता है जब आप

short s = 3; 

लिखने लेकिन यह, और नहीं के लिए फ्लोटिंग प्वाइंट मूल्यों केवल पूर्णांकों के लिए किया जाता है ।

0

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

Byte b = 3; 
Short s = 3; 
Integer i = 3; 
Long l = 3L; 
Float f = 3f; 
Double d = 3d; 
संबंधित मुद्दे