इस लाइन संकलित करता है नहीं:
test(E1.class,E2.class);
केवल एक ही प्रकार पैरामीटर E
है, और जावा तर्कों की अनुमानित प्रकार हूबहू मिलना चाहिए। यह Example
का अनुमान नहीं लगा सकता है, क्योंकि ऑब्जेक्ट Class<E1>
और Class<E2>
हैं, Class<Example>
नहीं। जावा जेनेरिक का आविष्कार इसे होने से रोकता है।
आप test
के सामान्य प्रकार पैरामीटर पर एक ऊपरी बाध्य वाइल्डकार्ड शुरू करने से इस पर काम कर सकते हैं:
public static <E extends Example> void test(Class<? extends E>... es)
यह, जावा E
के लिए Example
अनुमान लगाने के लिए अनुमति देता है E1
और E2
साथ ऊपरी बाध्य वाइल्डकार्ड संतोषजनक।
दूसरी पंक्ति जेनिक्स को छोड़कर और "अनचेक कॉल" चेतावनी उत्पन्न करने, Class
es की कच्ची सरणी बनाती है।
new Class[]{E1.class,E2.class}
आप यहाँ Class
करने के लिए एक प्रकार का तर्क प्रदान करने के लिए प्रयास करने के लिए थे, तो आप किसी भी आधे रास्ते उचित प्रकार पैरामीटर के साथ एक संकलक त्रुटि मिलती हैं:
// Needs Class<Example> but found Class<E1> and Class<E2>
test(new Class<Example>[]{E1.class,E2.class});
// Needs Class<E1> but found Class<E2>
test(new Class<E1>[]{E1.class,E2.class});
// Needs Class<E2> but found Class<E1>
test(new Class<E2>[]{E1.class,E2.class});
एक वाइल्डकार्ड का उपयोग करके अनुमान संतोषजनक यहां वास्तविक समस्या को हल करता है - जेनेरिक सरणी निर्माण।
// Generic array creation
test(new Class<? extends Example>[]{E1.class,E2.class});
घोषित करने की कोई स्पष्ट आवश्यकता नहीं थी। यह मेरे कार्यक्रम के लिए कभी भी हानिकारक नहीं था, लेकिन मैं निश्चित रूप से थोड़ी देर के लिए अपने सिर खरोंच कर रहा हूँ। मैं वास्तव में स्पष्टीकरण की सराहना करता हूं। – Squirvin