2012-07-07 14 views
6

मेरे पास एक साधारण वर्ग ऐप्पल एक और साधारण वर्ग फल से फैली हुई है।जावा में पहचानकर्ता के घोषित प्रकार का पता कैसे लगाएं?

रन समय में, मैं

Fruit fruit = new Apple(); 

fruit.getClass(); 

का उपयोग फल वस्तु है, जो Apple.class है के वास्तविक प्रकार प्राप्त करने के लिए कर सकता है।

मैं fruit instanceof Apple, और fruit instanceof Fruit का उपयोग यह सत्यापित करने के लिए भी कर सकता हूं कि यह फल वस्तु ऐप्पल या फल का एक उदाहरण है या नहीं। इन दोनों अभिव्यक्तियों में से दोनों सत्य वापस आते हैं, जो सामान्य है।

लेकिन क्या घोषित प्रकार fruit पहचानकर्ता निर्धारित करने का कोई तरीका है? इस मामले में Fruit है।

+1

आपको यह वर्णन करना चाहिए कि आप उस भेदभाव के बाद किस प्रभाव को प्राप्त करना चाहते हैं। मेरा मानना ​​है कि उस मूल समस्या को हल करने के अन्य तरीके हैं। – Bananeweizen

+2

मुझे उत्सुकता है कि आप क्यों जानना चाहते हैं (कैसे 'फल' घोषित किया गया था), और अलग से, आप पहले से ही क्यों नहीं जानते (क्योंकि आपके पास कोड है)। मैं एक उपयोग के मामले के साथ नहीं आ रहा हूँ। ऑब्जेक्ट जो 'फलों' को इंगित करता है ** ** एक 'ऐप्पल' है। 'फल' परिवर्तनीय के माध्यम से इसका इंटरफ़ेस' फल' है, लेकिन यह पूरी तरह से संकलित-समय की बात है। –

+0

ऐसा करने का क्या मतलब है - आपने फल को फल बनाने के लिए कोड किया है ताकि आप पहले से ही जान सकें कि यह क्या है। – DaveRlz

उत्तर

9

आप वास्तव में ऑब्जेक्ट के वास्तविक रनटाइम प्रकार (जो इस मामले में Apple है) की बजाय fruit की परिवर्तनीय घोषणा के बारे में एक प्रश्न पूछ रहे हैं।

मुझे लगता है कि यह सामान्य रूप से एक बुरा विचार है: आपने केवल चर घोषित किया है और संकलक को बताया है कि यह Fruit है, तो अब आपको इसे खोजने की आवश्यकता क्यों है?

बस मामलों और भी भ्रमित करने के लिए, यह ध्यान देने योग्य आप भी अलग घोषित प्रकार एक ही वस्तु (जो अभी भी एक एप्पल है) को संदर्भित साथ कई चर हो सकता है: यदि आप वास्तव में जानना चाहते हैं तो

Fruit fruit = new Apple(); // fruit declared as Fruit, but refers to an Apple 
Object thing = fruit;  // thing declared as Object, refers to the same Apple 

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

मुझे लगता है कि ये सभी बहुत बदसूरत हैं, इसलिए मेरी सामान्य सलाह "ऐसा न करें"।

+2

वास्तव में बुरा विचार। वैरिएबल का उल्लेख करना एक संकलन समय इकाई है। यदि संकलक इसे अनुकूलित करता है तो यह रनटाइम पर बिल्कुल मौजूद नहीं हो सकता है। – eran

+0

धन्यवाद @ मिकरा, मुझे लगता है कि आप सही हैं। मेरा सवाल ज्यादा समझ में नहीं आता है। मैं सोच रहा था कि अगर मैं ऑब्जेक्ट का वास्तविक रनटाइम प्रकार प्राप्त कर सकता हूं, तो मुझे इस ऑब्जेक्ट का संदर्भ देने वाले घोषित चर का प्रकार भी मिल सकता है। लेकिन आपका शुक्रिया:) –

3

Fruit ऑब्जेक्ट में घोषित प्रकार नहीं है। यह परिवर्तनीयfruit है जिसका प्रकार है। चूंकि एकमात्र चीज जिसे आप पास कर सकते हैं, Fruit ऑब्जेक्ट का संदर्भ है, मुझे नहीं लगता कि आपका अनुरोध अधिक समझ में आता है। सबसे अच्छा आप प्राप्त कर सकते हैं यदि आपके पास एक विशिष्ट आवृत्ति चर था जहां आपकी ऑब्जेक्ट संग्रहित है। फिर आप उस क्षेत्र पर प्रतिबिंबित कर सकते हैं और इसके घोषित प्रकार को Field.getType() के साथ प्राप्त कर सकते हैं।

3

नहीं, ऐसा नहीं है: कम से कम प्रतिबिंब का उपयोग नहीं कर रहा है। प्रतिबिंब आपको ऑब्जेक्ट रनटाइम पर फ़ील्ड, विधियों और कक्षाओं के बारे में जानकारी दे सकता है, लेकिन स्थानीय चर नहीं। यदि फल एक क्षेत्र था, तो आप निम्न की तरह कुछ कर सकते हैं:

FruitBasket.class.getDeclaredField("fruit").getType(); 
संबंधित मुद्दे