2012-12-03 9 views
15

अब तक, मेरी समझ यह थी कि ==.equals() के लिए एक ऑपरेटर ओवरलोड है। हालांकि, मैं हाल ही में पता चला किग्रोवी == ऑपरेटर

new Integer(1) == new Long(1) // returns true 

जबकि

new Integer(1).equals(new Long(1)) // returns false 

इसलिए मुझे लगता है कि वास्तव में ==.equals() के लिए एक आशुलिपि नहीं है, तो यह कैसे समानता निर्धारित करता है?

+0

यह GORM का उपयोग करते समय मुझे काटने के लिए जारी है, जिसमें लंबे डेटाबेस आईडी हैं। जेएसओएन से अनुरोधों ने उत्पन्न होने वाले पूर्णांक मानों को उत्पन्न किया: ग्रोवी: 000> एम = [1 एल: 'फू'] ===> [1: foo] ग्रोवी: 000> m.containsKey (1L) ===> सच ग्रोवी: 000> m.containsKey (1) ===> झूठी –

उत्तर

17

ग्रूवी में == मोटे तौर पर equals() के बराबर है, हालांकि, आप यह जावा से अलग है जब एक ही मूल्य के साथ विभिन्न वर्गों की तुलना मिल जाएगा - अगर वर्ग Comparable है। यदि संभव हो तो ग्रोवी टाइप कास्टिंग भी करता है।

यदि आप कोड देखते हैं, तो ऐसा लगता है कि compareToWithEqualityCheck()== के लिए निष्पादित किया गया है।

4

यह पता चला है कि ==equals() पर प्रतिनिधि नहीं है, यह compareTo पर प्रतिनिधि है। तो == सच वापस आ जाएगी अगर a.compareTo(b) रिटर्न 0

तो इस विशेष मामले

new Integer(1).compareTo(new Long(1)) == 0 
इसलिए

में:

new Integer(1) == new Long(1) 

लेकिन यह जरूरी नहीं है कि

new Integer(1).equals(new Long(1)) 

कारण यह सब अजीब और भ्रमित क्यों है क्योंकिहैकी आवश्यकता नहीं है कि यह बराबर के साथ संगत है, हालांकि इसकी दृढ़ता से अनुशंसा की जाती है।

यह दृढ़ता से अनुशंसा की जाती है (हालांकि आवश्यक नहीं) कि प्राकृतिक आदेश बराबर के अनुरूप होते हैं। ऐसा इसलिए है क्योंकि स्पष्ट तुलनाकर्ताओं के बिना सॉर्ट किए गए सेट (और सॉर्ट किए गए मानचित्र) तत्वों (या चाबियों) के साथ उपयोग किए जाने पर "अजीब" व्यवहार करते हैं जिनके प्राकृतिक क्रम बराबर के साथ असंगत है।