अन्य उत्तरों पर्याप्त रूप से समझाते हैं कि यह क्यों विफल रहता है, लेकिन उनमें से कोई भी इस मुद्दे के आसपास कम त्रुटि वाले कोड को लिखने का तरीका बताता है। टाइप-कास्ट्स (कोई कंपाइलर सहायता) जोड़ने के लिए याद रखने के लिए, एल के साथ प्रत्यय प्राइमेटिव्स और आगे भी आईएमएचओ स्वीकार्य नहीं है।
जब आपके पास प्राइमेटिव (और कई अन्य मामलों में) संग्रह की जीएनयू ट्रोव लाइब्रेरी का उपयोग करने की अत्यधिक अनुशंसा करते हैं। उदाहरण के लिए, एक TLongLongHashMap है जो चीजों को अंतराल के रूप में आंतरिक रूप से स्टोर करता है। नतीजतन, आप मुक्केबाजी/unboxing अंत कभी नहीं, और अप्रत्याशित व्यवहार के साथ अंत कभी नहीं:
TLongLongHashMap map = new TLongLongHashMap();
map.put(1L, 45L);
map.containsKey(1); // returns true, 1 gets promoted to long from int by compiler
int x = map.get(1); // Helpful compiler error. x is not a long
int x = (int)map.get(1); // OK. cast reassures compiler that you know
long x = map.get(1); // Better.
और इतने पर। सही प्रकार प्राप्त करने की कोई आवश्यकता नहीं है, और यदि आप कुछ मूर्खतापूर्ण करते हैं (एक int में लंबे समय तक स्टोर करने का प्रयास करें) तो संकलक आपको एक त्रुटि देता है (जिसे आप सही या ओवरराइड कर सकते हैं)।
ऑटो कास्टिंग के नियमों का मतलब है कि तुलना ठीक से के रूप में अच्छी तरह से काम:
if(map.get(1) == 45) // 1 promoted to long, 45 promoted to long...all is well
एक बोनस के रूप में, स्मृति भूमि के ऊपर और क्रम प्रदर्शन काफी बेहतर है।
स्रोत
2012-02-29 17:55:26
शायद मैं स्पष्ट नहीं था। मुझे पता है कि यह स्रोत कोड के रूप में क्यों होता है जो ऐसा करता है, मैंने पोस्ट करने से पहले कोड पढ़ा था। मेरा सवाल यह था कि क्यों फैसला किया गया कि यह इस तरह से होना चाहिए? –
http://stackoverflow.com/questions/445990/why-is-long-valueof0-equalsinteger-valueof0-false#446911 इसे और अधिक सही तरीके से समझाता है। चूंकि समानता के लिए लंबे समय तक पूर्णांक की तुलना करने से समरूपता का उल्लंघन हो सकता है। –