public class Test {
public static final Double DEFAULT_DOUBLE = 12.0;
public static final Long DEFAULT_LONG = 1L;
public static Double convertToDouble(Object o) {
return (o instanceof Number) ? ((Number) o).doubleValue()
: DEFAULT_DOUBLE;
}
public static Long convertToLong(Object o) {
return (o instanceof Number) ? ((Number) o).longValue() : DEFAULT_LONG;
}
public static void main(String[] args){
System.out.println(convertToDouble(null) == DEFAULT_DOUBLE);
System.out.println(convertToLong(null) == DEFAULT_LONG);
}
}
उत्तर
संपादित
त्रिगुट ऑपरेटर some type conversions under the hood करता है। आपके मामले में आप पुरातन और आवरण प्रकार, जिस स्थिति में आवरण प्रकार unboxed हो जाता है मिश्रण कर रहे हैं, तो त्रिगुट ऑपरेटर का परिणाम "फिर से बॉक्सिंग" है:
दूसरे और तीसरे ऑपरेंड में से एक की है आदिम प्रकार टी, और अन्य प्रकार के मुक्केबाजी रूपांतरण को लागू करने का परिणाम है (§5.1.7) टी करने के लिए, तो सशर्त अभिव्यक्ति के प्रकार टी
तो अपने कोड अनिवार्य रूप से किया जाता है समकक्ष (टाइपो के अलावा longValue
doubleValue
होना चाहिए):
public static void main(String[] args){
Double d = 12.0;
System.out.println(d == DEFAULT_DOUBLE);
Long l = 1L;
System.out.println(l == DEFAULT_LONG);
}
कुछ मूल्यों पर लंबे मूल्यों को कैश किया जा सकता है और ==
तुलना इसलिए सच हो सकती है। यदि आपने equals
के साथ सभी तुलना की है तो आपको दोनों मामलों में true
मिलेगा।
ध्यान दें कि अगर आप public static final Long DEFAULT_LONG = 128L;
का उपयोग करें और प्रयास करें:
Long l = 128L;
System.out.println(l == DEFAULT_LONG);
यह शायद, झूठी प्रिंट होगा क्योंकि लंबे समय मूल्यों आम तौर पर -128 और केवल 127 के बीच कैश नहीं किया जाता।
नोट: JLS की आवश्यकता है कि -127 और 128 के बीच char
, byte
और int
मूल्यों कैश हो लेकिन long
के बारे में कुछ नहीं कहा। तो आपका कोड वास्तव में एक अलग JVM पर दो बार झूठा प्रिंट कर सकता है।
तो आप कह रहे हैं कि निरंतर प्रचार ऑटो-मुक्केबाजी द्वारा नए में किया जाता है वस्तु। तो उन्हें दोनों झूठी वापसी करनी चाहिए। लेकिन फिर पूर्णांक छोटे मानों के लिए कैश किए जाते हैं, ताकि यह सच हो जाए? – Mysticial
@ मिस्टिकिक मूल रूप से यदि आप -127/+ 128 रेंज (जैसे 'इंटीजर i = 123;') में चार, बाइट या int पर मुक्केबाजी का उपयोग करते हैं, तो आपको हमेशा एक ही उदाहरण प्राप्त करने की गारंटी दी जाती है। यह लॉन्ग के लिए आवश्यक नहीं है लेकिन मेरे जेवीएम (ओरेकल जेडीके 7u11) पर मामला प्रतीत होता है। तो नहीं, मैं यह नहीं कह रहा हूं कि व्यवहार इंटीग्रियों को कैश किया जा रहा है। – assylias
हाँ, कैशिंग भाग मुझे पता है क्योंकि मैंने एसओ पर पहले देखा है। जब मैंने सवाल देखा, तो मुझे वास्तव में दोनों सच होने की उम्मीद थी क्योंकि वे दोनों मूल वस्तु के संदर्भ होंगे। लेकिन यहां मुझे लगता है कि यह मामला नहीं है। कंपाइलर/जेवीएम वास्तव में नई वस्तुएं बना रहा है (क्यों?)। – Mysticial
अजीब व्यवहार को समझने के लिए, आप अलग लेने के लिए यह क्या करता है की जरूरत है:
(o instanceof Number) ? ((Number) o).longValue() : DEFAULT_LONG
क्या हम यहाँ है विधि के लिए एक कॉल है कि एक long
देता है, और Long
का एक उदाहरण है। दो अलग प्रकार। हालांकि सशर्त ऑपरेटर ?
को एक प्रकार का उत्पादन करने की आवश्यकता है; या तो long
या Long
। और ऐसा करने के लिए, या तो दूसरा ऑपरेंड बॉक्स किया जाना चाहिए या तीसरा ऑपरेंड अनबॉक्स होना चाहिए।
इस मामले में, जेएलएस का कहना है कि तीसरा ऑपरेंड अनबॉक्स किया जाना चाहिए। JLS 15.25
"दूसरे और तीसरे ऑपरेंड में से एक आदिम प्रकार टी की है, और अन्य के प्रकार, टी करने के लिए मुक्केबाजी रूपांतरण (§5.1.7) लागू तो के प्रकार का परिणाम है तो सशर्त अभिव्यक्ति टी है। "
और इसका मतलब है कि आपके स्थिरांक को अनबॉक्स किया जा रहा है और फिर फिर से बॉक्स किया गया है।
अब मुक्केबाजी एक प्राचीन प्रकार बॉक्स बॉक्स प्रकार valueof()
विधि को कॉल करके किया जाता है। और ये विधियां बेस प्रकार के आधार पर थोड़ा अलग चीजें करती हैं।
- एक चल बिन्दु प्रकार के लिए,
valueof
हमेशा एक नई वस्तु - बनाता है एक अभिन्न प्रकार के लिए,
valueof
विधि कभी कभी एक नई वस्तु बनाता है, और कभी कभी किसी मौजूदा ऑब्जेक्ट देता है।
और बाद वाला यह हो रहा है कि यहां क्या हो रहा है। Long.valueof(1L)
हमेशा एक ही मूल्य लौटा रहा है, और ==
के साथ तुलना true
दे रही है।
दो "फिक्स" वहाँ रहे हैं ... यह सोचते हैं आप इसे ठीक करना चाहते हैं:
- दोनों शाखाओं में एक
return
के साथ एकif
/else
साथ त्रिगुट ऑपरेटर बदलें। कास्ट दूसरे संकार्य यह मजबूर करने के लिए बॉक्सिंग की जानी चाहिए:
return (o instanceof Number) ? (Long) ((Number) o).longValue() : DEFAULT_LONG;
आप सही हैं, धन्यवाद। –
- 1. यह प्रोलॉग क्वेरी सच और झूठी क्यों है?
- 2. क्यों यह सच है
- 3. यह सच क्यों है?
- 4. क्यों नहीं यह सच है == यह सच है:
- 5. यह हालत क्यों सच होती है?
- 6. यह सच है = पायथन 2.x में झूठी काम
- 7. 'यह सच है' और 'गलत' अजगर
- 8. एमवीसी जेसन प्रतिक्रिया सच/झूठी
- 9. यह अभिव्यक्ति क्यों सच होती है?
- 10. पायथन नियमित अभिव्यक्तियां सच/झूठी
- 11. ValidateRequest = झूठी लेकिन कार्रवाई में यह अभी भी सच है और इसे अनदेखा किया?
- 12. BCrypt.net जेनरेटसाल्ट (31) सीधे क्यों लौटता है?
- 13. ProgressEvent.lengthComputable झूठी क्यों है?
- 14. DoubleBuffered प्रॉपर्टी DataGridView पर झूठी क्यों डिफ़ॉल्ट है और यह सुरक्षित क्यों है?
- 15. सी # झूठी == सच कैसे हो सकता है? चित्र
- 16. यह हालत हमेशा क्यों सच है? (pktNum! = invPktNum)
- 17. ओरेकल में, '=' 'झूठी क्यों है?
- 18. झूठी और इसके विपरीत सच को फिर से परिभाषित करते समय अपेक्षित आउटपुट क्या होता है?
- 19. निम्नलिखित कोड "सत्य, सत्य, झूठा, सच" प्रिंट करता है। यह "सत्य, सच, सच, सच" नहीं होना चाहिए?
- 20. अगर (! यह) {वापसी झूठी; }
- 21. $ wpdb - यह असफल होने पर क्या लौटता है?
- 22. subprocess.stdout साथ खोल = सच और खोल अलग ढंग से व्यवहार करती है = झूठी
- 23. शून्य || झूठी और झूठी || रूबी
- 24. अधिभारित असाइनमेंट ऑपरेटर कक्षा के संदर्भ में क्यों लौटता है?
- 25. सी # सच्चाई और झूठी मूल्य
- 26. पर्ल सोच -1 क्यों सच है?
- 27. ModelState.IsValid == झूठी, क्यों?
- 28. क्यों (0 == 'हैलो') PHP में सच है?
- 29. jQuery सत्यापन यह .optional (तत्व) हमेशा झूठी
- 30. जावास्क्रिप्ट में "0 === -0" सच क्यों है?
यहाँ पुनर्त्पादित। यह अजीब है। हां, ओपी को 'बराबर() 'का उपयोग करना चाहिए, लेकिन इन चीजों के साथ खेलना हमेशा दिलचस्प होता है। – Mysticial
* गायब ब्रैकेट्स। और हाँ, कभी-कभी सच, दूसरों को झूठा। सिवाय इसके कि नल कभी-कभी 0 (या शून्य का गुच्छा) होता है, जो एक संख्या है। –
@Mysticial यदि आपको अजीब (और अभी तक अनिश्चित) सामान पसंद है: http://stackoverflow.com/questions/14624365/immutability-and-reordering – assylias