2010-05-20 7 views
7

कृपया इस के साथ मेरी मदद:जावा जेनेरिक घिरा वाइल्डकार्ड के साथ सामान्य प्रकार का संग्रह

तो Lion IS-A Animal और Cage<T> दिया:

Cage<? extends Animal> c = new Cage<Lion>(); // ok, 

लेकिन

Set<Cage<? extends Animal>> cc = new HashSet<Cage<Lion>>(); // not ok 

मैं यहाँ क्या नहीं दिख रहा है ?

उत्तर

6

गैर-वाइल्डकार्ड जेनेरिक प्रकार T के साथ एक चर (Set<T>) को असाइन करते समय , असाइन किए जाने वाले ऑब्जेक्ट में T होना चाहिए जो इसके सामान्य प्रकार (T, वाइल्डकार्ड और गैर-वाइल्डकार्ड के सभी सामान्य प्रकार पैरामीटर सहित) होना चाहिए। आपके मामले में TCage<Lion> है, जो Cage<? extends Animal> जैसा नहीं है।

Set<? extends Cage<? extends Animal>> a = new Set<Cage<Lion>>(); 
+0

+1। –

+0

धन्यवाद, मेरे लिए, वह गुम हिस्सा था। –

6

क्योंकि अगर यह अनुमति दी गई है, तो इस कानूनी होगा यह गलत है:

Set<Cage<? extends Animal>> cc = new HashSet<Cage<Lion>>(); 
cc.add(new Cage<Tiger>()); // legal -- Cage<Tiger> is a Cage<? extends Animal> 

Cage<Tiger> घोषणा की सीमा के भीतर है, लेकिन नहीं परिभाषा है, इसलिए इस दुर्घटना होगा।

+0

जावा कैसे तय कर सकते हैं contravariance/सहप्रसरण लागू या नहीं:

आप क्या कर सकते हैं, क्योंकि Cage<Lion>Cage<? extends Animal> को आबंटित है, वाइल्डकार्ड प्रकार का उपयोग है? – Simon

+0

मेरी समझ जावा जेनिक्स को इनवेरिएंट के रूप में मानती है (लेकिन, विचित्र रूप से, एरेज़ को कॉन्विएन्ट के रूप में मानती है और रनटाइम पर चेक टाइप करती है) लेकिन उपयुक्त वाइल्डकार्ड (विस्तारित या उपयुक्त के रूप में सुपर) पैरामीटर के साथ विधियों को लिखकर, और कास्टिंग और बिट्स अनचेक किए गए रूपांतरणों को दबाकर, आप जो भी आपके मामले में उचित है इंप्रेशन दे सकता है। वास्तविक समाधान के लिए – pdbartlett

2

आप की जरूरत है:

Number a = new Integer(1); // OK 
Set<Number> b = new HashSet<Integer>(); // not OK 

यह काम नहीं करता है क्योंकि यह

की अनुमति होगी:

Set<? extends List<? extends Number>> cc = new HashSet<ArrayList<Integer>>(); 

क्यों ... मैं वापस अपने उदाहरण का एक सरल संस्करण अप करने के लिए लगता है कि व्याख्या करने के लिए

b.add(new Double(3.0));