2012-08-30 12 views
5

संभव डुप्लिकेट:
Returning false from Equals methods without Overridingझूठी वापस जाने के लिए बराबर होती है

अपने साथी से एक आज मुझे एक प्रश्न पूछा के रूप में (नीचे

लिखें TestEquals वर्ग उल्लेख कस्टम या उपयोगकर्ता परिभाषित वर्ग) ताकि कोड में नीचे सोप false प्रिंट करता है।

public class Puzzle3 { 
    public static void main(String[] args) { 
    TestEquals testEquals = new TestEquals(); 
    System.out.println(testEquals.equals(testEquals)); 
    } 
} 

ध्यान दें: आप ओवरराइड नहीं कर सकते विधि के बराबर होती है।

मैंने बहुत सोचा लेकिन बराबर ओवरराइड किए बिना समाधान नहीं मिला। क्या किसी को पता है कि यह कैसे किया जा सकता है?

+7

यह होमवर्क नहीं है? –

+4

** ** ओवरलोडिंग ** की अनुमति है? – home

+2

डुप्लिकेट को दो डाउनवॉट और स्वीकार्य उत्तर केवल चार अपवॉट मिले। सवाल इस बार इतना बेहतर बनाता है? – maba

उत्तर

17

उपयोग

public boolean equals(TestEquals equals) { 
    return false 
} 

ओवरराइड करने के लिए आप इनपुट पैरामीटर की जरूरत बराबर प्रकार वस्तु के होने के लिए इतना ऊपर कोड स्निपेट theorectially नहीं अधिभावी बराबर वस्तु विधि से है

+5

यदि आपको ऐसा लगता है तो यह 'स्ट्रिंग' भी वापस कर सकता है। –

+0

कमाल! अभी तक 13 अपवॉट्स। – maba

+0

@DuncanJones अच्छी बात मैंने उस +1 के बारे में नहीं सोचा था कि – RNJ

0

मैं पता नहीं क्यों होगा कोई भी ऐसा करना चाहता है। लेकिन अगर आप एक तरीके के रूप में नीचे दिखाया गया है बना सकते हैं:

public boolean equals(SuperEquals equals) { return false; } 

कहाँ SuperEqualsTestEquals के किसी भी सुपर क्लास नहीं बल्कि Object है।

1

ऊपर उल्लेख किया है, तुम इतनी तरह एक विधि लिख सकते हैं:

public TestEquals extends Something { 
} 

public Something { 
    @Override public boolean equals(Object o) { 
     return false; 
    } 
} 
11

संपादित करें:

public boolean equals(TestEquals e) { 
    return false; 
} 

इसके अलावा, यदि TestEquals किसी अन्य वस्तु का विस्तार कर सकते जाहिर someone else इस विचार पर पहुंचे पहले एक और धागे पर, लेकिन मैं इसे यहां छोड़ दूंगा क्योंकि यह कोड काफी सरल है।


class TestEquals { 

    static { 
    System.setOut(new PrintStream(new FilterOutputStream(System.out) { 
     public void write(byte[] buf, int pos, int len) throws IOException { 
     if (len >= 4 && buf[pos] == 't') { 
      out.write(new byte[] { 
       (byte) 'f', (byte) 'a', (byte) 'l', (byte) 's', (byte) 'e' 
      }); 
      out.write(buf, pos + 4, len - 4); 
     } else { 
      out.write(buf, pos, len); 
     } 
     } 
    })); 
    } 
} 

इस भयानक हैक ओवरराइड या कुछ भी ओवरलोड equals से कोई लेना देना नहीं है, लेकिन TestEquals का उदाहरण बनाकर की कार्रवाई लोड करने के लिए वर्ग जो System.out लपेटता का कारण बनता है, ताकि बाद में किसी भी प्रिंट कि 't' साथ शुरू होता है पहले 4 बाइट्स के बजाय मुद्रित होने के लिए "false" का कारण बन जाएगा। (डिफ़ॉल्ट एन्कोडिंग मानना ​​कुछ सुपर-विदेशी नहीं है।)

+0

एक्सेलेंट विचार :) – gontard

+0

+1 बॉक्स के बाहर सोचने के लिए +1। – maba

-1

मेरे आईपैड पर ... रणनीति को हर बार एनी विशेषता होने पर कुछ होना चाहिए जो हर बार संशोधित होता है .. यह काम करेगा अगर यह काम करेगा समानता पर गेटटर के माध्यम से विशेषता का उपयोग किया जाता है। आप उल्लेख करते हैं कि बराबर ओवरराइड नहीं किया जा सकता है इसलिए विशेषता निजी होनी चाहिए और मान को संशोधित करने से पहले मूल्य के संशोधन होने के बाद होता है, यह सुनिश्चित करने के लिए कि इससे कोई फर्क नहीं पड़ता कि यह बराबर का पहला या दूसरा भाग है।

कुछ की तरह (किसी भी वाक्यविन्यास त्रुटियों के लिए खेद है):

public class TestEquals{ 

private int id; 

public int getId(){ 
    int temp; 
    id++; 
    temp=id; 
    id++; 
    return temp; 
} 
} 
+0

ऑब्जेक्ट.क्वल्स (ऑब्जेक्ट ओबीजे) में पहली जांच 'if (this == obj) सत्य लौटती है। –

संबंधित मुद्दे