2012-08-01 25 views
13

या तो जावाडोक के साथ ही कोड अपने आप में, तुलनाकारी इंटरफेस को परिभाषित करता:java.util.comparator में लागू करने के लिए बराबर क्यों अनिवार्य नहीं है?

int compare(T o1, T o2); 
boolean equals(Object obj); 

लेकिन तब यह compilating नहीं probs देता है:

Comparator a = new Comparator() {  
    @Override public int compare(Object o1, Object o2) { 
     //.. 
    } 
}; 

लेकिन इस करता है:

Comparator a = new Comparator() {  
    @Override public boolean equals(Object comparator) { 
     //.. 
    } 
}; 

कैसे यह इंटरफ़ेस के लिए किया गया है ताकि हम विधि को ओवरराइड न करें?

उत्तर

22

स्पष्ट रूप से सभी JavaDocs explain कि आप इस विधि को लागू करता है चाहिए पहले:

साथ ही, इस विधि सच लौट सकते हैं केवल यदि निर्दिष्ट वस्तु भी एक तुलनित्र है और यह इस तुलनित्र के रूप में ही आदेश लगाता है। इस प्रकार, comp1.equals(comp2) का अर्थ है कि प्रत्येक ऑब्जेक्ट संदर्भ o1 और o2 के लिए sgn(comp1.compare(o1, o2))==sgn(comp2.compare(o1, o2))

लेकिन बाद में:

ध्यान दें कि यह हमेशा Object.equals(Object) ओवरराइड करने के लिए नहीं सुरक्षित है।

equals() को ओवरराइड करना संभव नहीं है, भले ही यह एक इंटरफ़ेस का हिस्सा हो? चूंकि जावा में प्रत्येक ऑब्जेक्ट के लिए यह विधि पहले से लागू की गई है (in Object class)।

इंटरफ़ेस में घोषणा equals() के महत्व के साथ केवल Comparator के संबंध में अतिरिक्त जावाडोक स्पष्टीकरण जोड़कर जोर देती है।

बीटीडब्ल्यू यदि आपका तुलनित्र स्टेटलेस है तो आपके पास केवल एक उदाहरण होना चाहिए - इस स्थिति में डिफ़ॉल्ट equal() कार्यान्वयन ठीक है।

+0

मैंने दूसरे भाग को पढ़ा था, लेकिन मेरा मतलब है, क्या एक इंटरैस विस्तार भी सामान्य सामान्य उदाहरण की तरह ऑब्जेक्ट कर रहा है? या क्या आपका मतलब है कि एक इंटरफ़ेस इस बात से अवगत है कि किसी भी ऑब्जेक्ट में कौन से तरीकों को पहले से लागू किया जा सकता है, जिससे यह उन्हें मजबूर नहीं करता है? – Whimusical

+4

@ user1352530 वास्तव में, न तो। इंटरफेस 'ऑब्जेक्ट' से अवगत नहीं है। लेकिन जब आप एक इंटरफ़ेस को कार्यान्वित कर रहे होते हैं, तो आप हमेशा 'ऑब्जेक्ट' से सीधे या परोक्ष रूप से उत्तराधिकारी होते हैं। इसका मतलब है कि आप पहले से ही 'बराबर()' और अन्य को विरासत में मिला है, इसलिए संकलक शिकायत नहीं कर रहा है। दूसरी तरफ ध्यान दें कि जब आपके पास किसी इंटरफ़ेस का उदाहरण होता है, तो आप उस पर किसी भी 'ऑब्जेक्ट' विधि को कॉल कर सकते हैं, न कि उस विशेष इंटरफ़ेस के मुश्किल तरीके से। –

+0

अच्छा जवाब, उपयोगी! – Whimusical

0

प्रत्येक ऑब्जेक्ट पहले से ही बराबर लागू करता है()।

वास्तविकता में बराबर() फिर से तुलनात्मक रूप से निर्दिष्ट करता है तुलनात्मक इंटरफ़ेस परिभाषा अनुबंध को दस्तावेज करने और तुलना के साथ इसके संबंधों को छोड़ने का मौका देने के अलावा कुछ भी नहीं करता है।()।