मैं जावा में सामान्य प्रकार को समझने की कोशिश कर रहा हूं, और सिद्धांत रूप में यह समझ में आता है, लेकिन जब मुझे इसे वास्तविक कोड पर लागू करने की आवश्यकता है तो मुझे समस्या है। मैं अमूर्त विधि घोषित करना चाहता हूं जो सामान्य प्रकार लौटाएगा। आइए मान लें कि मेरे पास मैजिकेबल नामक कुछ खाली इंटरफ़ेस है और 2 वर्ग इसे लागू करता है: मैजिक और विच। अब मुझे आश्चर्य है कि क्या उन 3 घोषणाओं के बीच अंतर है:वाइल्डकार्ड का उपयोग करने और जावा में अमूर्त विधि में जेनेरिक प्रकार घोषित करने के बीच अंतर
/*1*/protected abstract <T extends Magicable> List<T> getMagicables();
/*2*/protected abstract List<? extends Magicable> getMagicables();
/*3*/protected abstract List<Magicable> getMagicables();
पहले मामले में मैं समस्या है जब मैं कुछ वर्ग जो अमूर्त वर्ग फैली में इस विधि के शरीर लागू करना चाहते हैं:
प्रकार सुरक्षा: वापसी प्रकार सूची
मैं चेतावनी संदेश है मैजिकिकन सेवा के प्रकार सेमैजिकेबल > के अनुरूप मैजिकिकन सेवा के लिए मैजिकिकन() के लिए मैग्निक > मैकिकन सेवा के लिए अनचेक रूपांतरण की आवश्यकता है।
दूसरे मामले में मैं इस चेतावनी की जरूरत नहीं है, लेकिन मैं जिसमें मैं सार विधि से ऊपर घोषित सार कक्षा में समस्या है:
public void <T extends Magicable> T getOneFromList() { List<T> list = getMagicables(); //..... }
इस मामले में मैं getMagicables में संकलन त्रुटि है () कॉल:
टाइप मिस्चैच: सूची < कैप्चर # 2-से कनवर्ट नहीं कर सकता? < टी >
तीसरा मामला दोनों कोड के उपरोक्त स्थानों में संकलन त्रुटियों का कारण बनता सूची में Magicable > फैली हुई है। मुझे नहीं लगता कि यह मेरे मामले में सही समाधान है या नहीं।
'सूची चुड़ैलों = getMagicables (चुड़ैल उपयोग नहीं कर सकते .class); 'करने योग्य है - 1.' (कक्षाके साथप्रकार) .... type.cast (obj) ... '। –
यह बेहद असंभव है कि # 1 विधि का एक रूप है जो कभी भी उपयोग करेगा। चूंकि 'टी' के प्रकार के तर्क को कोड द्वारा दिया गया है जो विधि को कॉल करता है और चूंकि हम 'टी' का नया उदाहरण नहीं बना सकते हैं, इसलिए एकमात्र चीज बिना किसी प्रकार की अनचेक कास्ट के कर सकती है, एक खाली सूची लौटाती है । इसलिए क्यों उदा। ['संग्रह .emptyList'] (http://docs.oracle.com/javase/8/docs/api/java/util/Collections.html#emptyList--) और इसी तरह के एकमात्र स्थान हैं जिन्हें आप पाएंगे तरीका। – Radiodef