2016-10-10 3 views
5

में अजीब चीजें जावा में कुछ अजीब चीजें मिलीं।जावा

कोड:

System.out.println(System.getProperty("java.version")); 
System.out.println((true) ? (int)2.5 : 3.5); 
System.out.println((true) ? (int)2.5 : 3); 
System.out.println((true) ? (int)2.5 + "" : 3.5); 

परिणाम:

 
1.8.0_40 
2.0 
2 
2 

यह क्या है? क्यों पूर्णांक मान केवल तभी लौटाता है जब गलत के लिए मान डबल नहीं है या यदि स्ट्रिंग मान सत्य के लिए मूल्य में जोड़ा गया है? दूसरी लाइन राउंडिंग में क्यों (int) कास्ट किया जाता है, लेकिन दोहरे मूल्य अभी तक लौटते हैं? क्या यह एक बग है?

+0

नहीं, ये चीजें बग नहीं हैं। – Jesper

+4

जहां तक ​​कंपाइलर का संबंध है, पूरे '?:' अभिव्यक्ति के लिए केवल एक ही प्रकार है, और यह दोनों पक्षों के बीच सबसे संकीर्ण प्रकार को सामान्य रूप से ढूंढकर पता लगाता है। –

+0

(मुझे विश्वास है कि मुझे आश्चर्य है कि अंतिम पंक्ति संकलित है, हालांकि।) –

उत्तर

3

एक योजनाबद्ध में:

(true) ? (int)2.5 : 3.5 

     int  double 
      \  /
      double 

double शाब्दिक 2.5 int 2 को downsampled है, तो double 2.0 करने के लिए वापस पदोन्नत क्योंकि कि सशर्त अभिव्यक्ति के प्रकार है।

4

https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.25 इन सभी नियमों को निर्दिष्ट करता है, जो आपके मनाए गए आउटपुट के साथ बिल्कुल लगातार व्यवहार कर रहे हैं।

संपूर्ण टर्नरी अभिव्यक्ति के लिए केवल एक ही प्रकार है, और यही वह है जो वापस आता है और यही System.out.println पर कॉल किया जा रहा है। यदि आप उस विनिर्देशन में तालिका में इसे देखते हैं, तो आप पाएंगे कि आपके द्वारा उल्लिखित लाइनों में क्रमशः double, int और Object होने जा रहे हैं।

2

टर्नरी ऑपरेटर का निरंतर रिटर्न प्रकार होता है।

JLS, section 15.25 से

:

अन्यथा, (§5.6.2) बाइनरी संख्यात्मक पदोन्नति संकार्य प्रकार के लिए लागू है, और सशर्त अभिव्यक्ति के प्रकार दूसरे और तीसरे ऑपरेंड के पदोन्नत प्रकार है।

इसका मतलब है कि (true) ? (int)2.5 : 3.5 में, 2.5, एक int में बदल जाती है (पूर्णांक) फिर एक double चौड़ी। क्योंकि दूसरी तरफ भी एक int है

(true) ? (int)2.5 : 3 में, int, एक double को चौड़ा किया की जरूरत नहीं है।

अंत में, (true) ? (int)2.5 + "" : 3.5); में, यह , चौड़ी नहीं किया जा सकता क्योंकि यह पहले से ही एक String में बदल दिया गया है।