जावा: क्यों जरूरत के लिए instanceof () डाली टाइप करने के लिए बराबर में ()? यह संदर्भ या उससे कम कोड के लिए है?

वोट
0

जावा यहाँ नौसिखिया, मैं एक बुनियादी सवाल है कि आधे अन्य धागे या डॉक्स में पिछली प्रतिक्रियाएं द्वारा उत्तर दिया है, लेकिन मैं अभी भी पूरी तरह तंत्र समझ में नहीं आता है और मैं होना चाहता हूँ यकीन है कि मैं तल पर बुनियादी बातों (कोड, में सवालों को शामिल किया गया मध्य)।

असल में, मैं अगर दो MyDate वस्तुओं एक ही तिथि है की जाँच करने के बराबर () विधि अधिभावी कर रहा हूँ। मैं एक instanceof जांच अगर ओ वस्तु एक MyDate वस्तु है, तो आप एक MyDate वस्तु के लिए विशेष रूप से एक अस्थायी वस्तु डाली प्रकार oतो आप तिथियों की तुलना करें। तुम क्यों ओ, की MyDate वर्ग के लिए अस्थायी चर डाली प्रकार जब यह पहले से ही MyDate वर्ग की है?

  1. आप वस्तु आप बराबर () तुलना चलाना चाहते हैं एक आसान संदर्भ के रूप में अस्थायी चर का उपयोग करें? क्योंकि आप की तुलना के रूप में बराबर () का उपयोग MyDate.equals(MyOtherDate)कोड में, अगर मैं एक चर को नामित नहीं है तो संदर्भ धारण करने के लिए आप करने के विभिन्न त्रुटियों (अस्थायी एक चर, प्रकार मेल नहीं खाता, आदि के रूप में हल नहीं किया जा सकता है मूल रूप से संकलक नहीं यकीन है कि जहां है देखो के लिए जब तक आप एक गुच्छा अधिक कोड लिखने)।

2 ए। अन्य धागे से कुछ प्रभाव है कि जब तक जांच करता है instanceof अगर एक उदाहरण एक वर्ग से है, यह जाँच करता है के लिए कुछ कहा आधार वर्ग है, लेकिन एक उपवर्ग जांच नहीं करता। क्योंकि आप विशेष रूप से (एक विशिष्ट वस्तु के लिए एक सामान्य वस्तु से प्रकार कास्टिंग) कि विशिष्ट वस्तु की जांच करने के संकलक कह रहे हैं आप typecasting है। नोट: यह एक संस्करण और स्वाद विशिष्ट प्रकार प्रश्न हो सकता है, मैं इसी तरह के सवाल करने के लिए विभिन्न उत्तरों देखा है।

2 बी। कास्टिंग संदर्भ, नहीं वस्तु ही बदल जाता है। तो, वस्तुओं एक ही कक्षा से कर रहे हैं, लेकिन विभिन्न उपवर्गों, नहीं होगा यह संकलन समय के बजाय, कार्यावधि में असफल। और न मैं एक ClassCastException मिलेंगे?

public boolean equals(Object o) {
            if (o instanceof MyDate) {
                MyDate temp = (MyDate) o;
                if ((temp.day == day) && (temp.month == month) && (temp.year == year)) {
                    return true;
                }
            } 
            return false;
        }
14/01/2020 को 00:01
का स्रोत उपयोगकर्ता
अन्य भाषाओं में...                            


2 जवाब

वोट
0

जावा कम्पाइलर MyDate होने के रूप में अपनी वस्तु 'ओ' के प्रकार के वर्ग को नहीं समझता। यह तब हो क्योंकि तुम प्रकार वस्तु का एक पैरामीटर प्राप्त हो गया है, तो यह एक वस्तु के रूप पढ़ा जाएगा। तरीकों और ज्ञात प्रकार MyDate के पैरामीटर के गुणों पर पहुंचने के लिए, आप संकलक बताने के लिए कि इस प्रकार की एक वस्तु है की जरूरत है MyDate। इस तरह संकलक को समझने के लिए आप क्या कर रहे हो रहा है है। अब हम एक और दृश्य दृष्टि के लिए एक नज़र डालें।

जावा में हर प्रकार के प्रकार का विस्तार Objectजिसका अर्थ है कि हर बार जब आप एक वर्ग लिखते हैं, आप अप्रत्यक्ष रूप से विस्तार कर रहे Objectसार्वजनिक / संरक्षित गुण और व्यवहार। के कारण है कि आप विधि "अधिभावी" कर रहे हैं यही कारण है कि equalsहै कि के अंतर्गत आता है Objectप्रकार। ठीक है, जब आप दो वस्तुओं के बीच एक तुलना कर रहे हैं जब आप पहली बार जांच करना चाहिए, तो उन दोनों को एक ही प्रकार के अंतर्गत आता है के रूप में आप के साथ अपने उदाहरण में किया था: if (o instanceof MyDate) { ... }यह सुनिश्चित करें कि oइस प्रकार का है MyDate। लेकिन इस बिंदु पर, जैसा कि आप "MyDate" को "ओ" कास्ट नहीं किया टाइप आप पहुँच MyDate के विशिष्ट गुण या विधियों के लिए सक्षम नहीं होगा। तो थोड़ी देर के लिए के बारे में सोच, अगर मैं एक वर्ग है Aकि मेरी कक्षा फैली Bमैं पहुँच बी सार्वजनिक तरीकों और एक अंदर गुण में सक्षम हो जाएगा, लेकिन मैं बी पर भी ऐसा ही नहीं कर सकते क्योंकि बी नहीं देख सकता कि नीचे क्या हो रहा है पेड़। आप समझे?

आशा है कि मैं अपने संदेह का जवाब दे।

14/01/2020 को 00:16
का स्रोत उपयोगकर्ता

वोट
2

: जावा दो संबंधित बल्कि अलग अवधारणाओं है प्रकार एक की अभिव्यक्ति है, और क्रम-प्रकार एक के मूल्य

इन अवधारणाओं को कुछ हद तक संगत कर रहे हैं; अगर एक अभिव्यक्ति प्रकार है MyDate, तो जब आपको लगता है कि अभिव्यक्ति का मूल्यांकन, आप या तो एक वस्तु जिसका क्रम-प्रकार या तो है के लिए एक संदर्भ पाने MyDateया का एक उपवर्ग MyDate, या आप एक अशक्त संदर्भ मिलता है, या आप एक अपवाद या अनंत लूप या whatnot मिलता है। लेकिन अवधारणाओं अलग कर रहे हैं, और यहां तक कि जब अपने क्रम-प्रकार ठीक हैं, कभी कभी आप संकलक प्रकार के बारे में कुछ अतिरिक्त जानकारी देने के लिए की जरूरत है।

> क्यों आप ओ, की MyDate वर्ग के लिए अस्थायी चर डाली प्रकार जब यह पहले से ही MyDate वर्ग की है?

चर oप्रकार का है Objectनहीं, कभी प्रकार के MyDate। यह एक वस्तु जिसका क्रम प्रकार है के लिए एक संदर्भ शामिल करने के लिए होता है MyDate(या उनका उपवर्ग MyDate), लेकिन यह के प्रकार को प्रभावित नहीं करता o। तो अगर आप लिखना (MyDate)oएक ही मूल्य (और इसलिए एक ही क्रम प्रकार) और इच्छित प्रकार के साथ एक अभिव्यक्ति बनाने के लिए।

यदि संकलक होशियार थे, यह शायद का इलाज कर सकता है oप्रकार होने के रूप में MyDateअपने अंदर if-statement है, तो आप कलाकारों की जरूरत नहीं होगी; लेकिन मौजूदा जावा भाषा विशिष्टता है कि अनुमति नहीं है। (और अगर ऐसा हुआ, कि कुछ अजीब प्रभाव जब यह स्थिर विधि प्रेषण की बात आती है हो सकता था।)

14/01/2020 को 00:21
का स्रोत उपयोगकर्ता

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more