जैसा कि मैं उन्हें समझता हूं, जेनेरिक जावा की एक संकलित समय सुविधा है, और पैरामीट्रिज्ड प्रकार की जानकारी संकलित बाइट कोड में मौजूद नहीं है। अब मैंने फील्ड # getGenericType और Method # getGenericReturnType विधियों की खोज की है, इस प्रकार मेरी दुनिया के दृश्य को तोड़कर। कृपया इसे एक साथ टुकड़े करने में मेरी मदद करें।जावा टाइप एरर बनाम फील्ड # getGenericType और Method # getGenericReturnType
उत्तर
जब आप अपने आईडीई में संकलित बाइटकोड के एक जार से निपट रहे हैं, तो भी आप सामान्य ऑटो-पूर्णता प्राप्त कर सकते हैं। इस तरह यह लागू किया गया है। असल में आप सही हैं: प्रकार पूरी तरह मिटा नहीं गए हैं।
केवल रनटाइम प्रकार की वस्तुओं को मिटा दिया जाता है। उदाहरण के लिए:
Object obj = new ArrayList<String>();
obj.getClass()
ArrayList.class
वापस आ जाएगी। आप यह भी बता सकते हैं कि ArrayList
में एक सामान्य पैरामीटर है। लेकिन obj
को ArrayList<String>
, ArrayList<Integer>
, ArrayList<Object>
, ArrayList
(कच्चे), या कुछ और के रूप में बनाया गया था, यह बताने का कोई तरीका नहीं है।
स्थिर प्रकार की जानकारी कक्षा, विधियों आदि के लिए अभी भी है (हालांकि स्थानीय लोगों के लिए नहीं)। यह कक्षा फ़ाइल में विशेषताओं के रूप में संलग्न डेटा का एक अतिरिक्त हिस्सा है, और रनटाइम पर उपलब्ध है। रनटाइम प्रतिधारण के साथ एनोटेशन के समान ही सोचें। क्या कोई सवाल था?
फ़ील्ड और विधियों के लिए स्टेटिक सामान्य प्रकार की जानकारी संकलित कक्षा फ़ाइल में मौजूद होना चाहिए, ताकि जब आप इसके खिलाफ अन्य स्रोत कोड संकलित कर सकें, तो संकलक प्रकार की जांच कर सकता है। उदाहरण के लिए, जब आप कोड लिखते हैं जो ArrayList<E>
प्रकार के चर का उपयोग करता है, और get()
विधि पर कॉल करें, तो आपके पास ArrayList
कक्षा के लिए स्रोत कोड नहीं है। संकलक चला जाता है और संकलित कक्षा फ़ाइल को देखता है और get()
विधि का जेनेरिक रिटर्न प्रकार प्राप्त करता है, और यह महसूस करता है कि यह सामान्य प्रकार E
देता है, ताकि यह टाइपिंग जांच कर सके। इस प्रकार जेनेरिक प्रकार की जानकारी मौजूद होनी चाहिए ताकि संकलक इसे देख सके।