मैं समझाने के लिए @DerMike से उत्तर को तोड़ने की कोशिश करना चाहता हूं:
सबसे पहले, प्रकार के क्षरण का मतलब यह नहीं है कि जेडीके समाप्त हो जाता है रनटाइम में टाइप जानकारी को है। यह संकलन-समय प्रकार की जाँच और एक ही भाषा में सह-अस्तित्व के लिए क्रम प्रकार संगतता की अनुमति देने के लिए एक विधि है। जैसा कि कोड के इस ब्लॉक का तात्पर्य है, जेडीके मिटाए गए प्रकार की जानकारी को बरकरार रखता है - यह सिर्फ चेक किए गए कास्ट और सामान से जुड़ा नहीं है।
दूसरा, यह सामान्य प्रकार के सामान्य वर्ग को सामान्य प्रकार की जानकारी प्रदान करता है, ठोस प्रकार से पदानुक्रम की जाँच की जा रही है - यानी जेनेरिक प्रकार के मापदंडों के साथ एक अमूर्त अभिभावक वर्ग स्वयं के ठोस कार्यान्वयन के लिए अपने प्रकार के मापदंडों के अनुरूप ठोस प्रकार पा सकता है। यह सीधे इसे से विरासत में मिला है। यदि यह वर्ग गैर-सार और तात्कालिक था, या ठोस कार्यान्वयन दो स्तरों से नीचे था, तो यह काम नहीं करेगा (हालांकि थोड़ा सा जिम्मीइंग इसे एक से परे स्तर के किसी भी पूर्वनिर्धारित संख्या पर लागू कर सकता है, या सबसे कम कक्षा तक। एक्स जेनेरिक प्रकार के मापदंडों के साथ, एट वगैरह)।
वैसे भी, स्पष्टीकरण पर। यहाँ कोड फिर से, संदर्भ की आसानी के लिए लाइनों में अलग किया गया है:
1 # कक्षा का जेनेरिकप्रेम 0 ओएफटी क्लिक्स =
2 # (कक्षा)
3 # ((परिमितीकृत प्रकार)
4 # getClass ()
5 # .गैजेनिकसुपरक्लास ())
6 # .getActualTypeArguments () [0];
बता दें कि 'हम' जेनेरिक प्रकारों के साथ सार वर्ग है जिसमें यह कोड होता है। इसे मोटे तौर पर अंदर बाहर पढ़ना:
- लाइन 4 को वर्तमान ठोस वर्ग 'श्रेणी का उदाहरण मिलता है। यह हमारे तात्कालिक वंशज के ठोस प्रकार की पहचान करता है।
- लाइन 5 को एक प्रकार के रूप में उस वर्ग का सुपरपेप मिलता है; यह हमलोग हैं। चूंकि हम एक पैरामीट्रिक प्रकार हैं, इसलिए हम खुद को ParameterizedType (पंक्ति 3) में सुरक्षित रूप से डाल सकते हैं। कुंजी यह है कि जब जावा इस प्रकार की वस्तु को निर्धारित करता है, तो यह नए पैरामीटाइज़रटाइप उदाहरण में हमारे प्रकार के मापदंडों के साथ प्रकार की जानकारी को जोड़ने के लिए बच्चे में मौजूद प्रकार की जानकारी का उपयोग करता है। तो अब हम अपने जेनेरिक के लिए ठोस प्रकार तक पहुँच सकते हैं।
- कक्षा 6 में हमारे कोड में टाइप किए गए प्रकारों की श्रेणी क्रमबद्ध है, जैसा कि कक्षा कोड में घोषित किया गया है। इस उदाहरण के लिए हम पहला पैरामीटर निकालते हैं। यह एक प्रकार के रूप में वापस आता है।
- पंक्ति 2 अंतिम प्रकार को एक कक्षा में वापस लाती है। यह सुरक्षित है क्योंकि हम जानते हैं कि हमारे जेनेरिक प्रकार के पैरामीटर किस प्रकार के लिए सक्षम हैं और पुष्टि कर सकते हैं कि वे सभी कक्षाएँ होंगे (मुझे यकीन नहीं है कि जावा में कैसे एक सामान्य पैरामीटर प्राप्त करने के बारे में जाना जाएगा जिनके पास कक्षा उदाहरण नहीं है इसके साथ जुड़ा हुआ है, वास्तव में)।
...और बस यही सब है। इसलिए हम अपने स्वयं के ठोस कार्यान्वयन से प्रकार की जानकारी को अपने आप में वापस धकेलते हैं, और इसका उपयोग एक वर्ग के हैंडल तक पहुंचने के लिए करते हैं। हम getGenericSuperclass () को दो स्तर तक बढ़ा सकते हैं, या getGenericSuperclass () को समाप्त कर सकते हैं और अपने लिए एक ठोस प्रकार के रूप में मान प्राप्त कर सकते हैं (चेतावनी: मैंने इन परिदृश्यों का परीक्षण नहीं किया है, वे मेरे लिए अभी तक नहीं आए हैं)।
यह मुश्किल हो जाता है यदि आपके ठोस बच्चे मनमाने ढंग से संख्याओं से दूर हो जाते हैं, या यदि आप ठोस हैं और अंतिम नहीं हैं, और विशेष रूप से मुश्किल है यदि आप अपने किसी भी (वैरिएबल डीप) बच्चों से अपेक्षा करते हैं कि वे अपने स्वयं के जेनेरिक हों। लेकिन आप आमतौर पर उन विचारों के इर्द-गिर्द डिजाइन कर सकते हैं, इसलिए यह आपको सबसे ज्यादा पसंद आता है।
आशा है कि यह किसी की मदद की! मैं मानता हूं कि यह पद प्राचीन है। मैं शायद इस स्पष्टीकरण को स्निप करूंगा और इसे अन्य सवालों के लिए रखूंगा।