मुझे लगता है कि अन्य उत्तरों ने यह कुछ हद तक कहा है, लेकिन बहुत स्पष्ट रूप से नहीं। जेनरिक के साथ समस्याओं में से एक प्रतिबिंब प्रक्रिया के दौरान सामान्य प्रकार खो रहा है। उदाहरण के लिए:
List<String> arr = new ArrayList<String>();
assertTrue( ArrayList.class, arr.getClass() );
TypeVarible[] types = arr.getClass().getTypedVariables();
दुर्भाग्य से, लौटे प्रकार आपको यह नहीं बता सकते हैं कि गिरफ्तारी के सामान्य प्रकार स्ट्रिंग हैं। यह एक सूक्ष्म अंतर है, लेकिन यह महत्वपूर्ण है। चूँकि गिरफ्तारी रनटाइम के दौरान की जाती है, इसलिए जेनेरिक प्रकार को रनटाइम पर मिटा दिया जाता है ताकि आप इसका पता न लगा सकें। जैसा कि कुछ कहा गया ArrayList<Integer>
है, ArrayList<String>
प्रतिबिंब के दृष्टिकोण से समान है ।
यह जेनरिक के उपयोगकर्ता के लिए कोई मायने नहीं रख सकता है, लेकिन मान लीजिए कि हम कुछ फैंसी फ्रेमवर्क बनाना चाहते थे, जो कि फैंसी चीजों का पता लगाने के लिए प्रतिबिंब का उपयोग करते थे कि उपयोगकर्ता किस तरह से एक ठोस सामान्य प्रकार की घोषणा करता है।
Factory<MySpecialObject> factory = new Factory<MySpecialObject>();
MySpecialObject obj = factory.create();
मान लीजिए कि हम एक जेनेरिक फैक्ट्री चाहते हैं, MySpecialObject
क्योंकि हम इस उदाहरण के लिए घोषित ठोस जेनेरिक प्रकार का निर्माण कर रहे हैं। खैर फैक्ट्री वर्ग इस उदाहरण के लिए घोषित ठोस प्रकार का पता लगाने के लिए खुद से पूछताछ नहीं कर सकता क्योंकि जावा ने उन्हें मिटा दिया था।
.Net के जेनरिक में आप ऐसा कर सकते हैं क्योंकि रनटाइम के दौरान वस्तु जानती है कि यह सामान्य प्रकार है क्योंकि कंपाइलर ने इसे बाइनरी में कंप्लीट किया है। Erasures के साथ Java ऐसा नहीं कर सकता।