2013-04-12 4 views
11

का उपयोग करते समय मैं नीचे के रूप में वस्तु बनाने के लिए प्रयास करें:संग्रह ऑब्जेक्ट निर्माण जेनेरिक्स

Map<Integer, Map<String, Integer>> myMap = new HashMap<Integer, HashMap<String, Integer>>(); 

क्या वाक्य रचना गलत है, किसी भी एक मुझे व्याख्या कर सकते हैं?

उत्तर

10

यह

List<Animal> list = new ArrayList<Dog>(); 

Parameterized प्रकार की तरह समान त्रुटि दोनों अंत में एक ही प्रकार के होना चाहिए। कोई विरासत (आईएस-ए) अवधारणा नहीं है। यदि आप अभी भी इसका उपयोग करना चाहते हैं तो विस्तृत/सुपर कीवर्ड के साथ वाइल्डकार्ड (?) का उपयोग करें, जो बराबर चिह्न के बाईं ओर केवल अनुमति है।

List<Animal> list = new ArrayList<Dog>(); // is not allowed 

लेकिन

Animal[] animal = new Dog[10]; //is allowed 
animal[0] = new Dog(); // is allowed 

है जिसे बाद में असफल हो जायेगी और फेंक अपवाद यदि किसी Cat जोड़ने की कोशिश (फैली पशु) वस्तु।

animal[1] = new Cat(); //compiles fine but throws java.lang.ArrayStoreException at Runtime. 

याद रखें animal[1] या animal[index] कुत्ते की reference पहना हुआ है। तो Dog संदर्भ चर Dog ऑब्जेक्ट Cat ऑब्जेक्ट नहीं देख सकता है।

तो इस तरह के परिदृश्य से बचने के लिए, जेएसएल ने जेनेरिक सूची/संग्रह में ऐसे बदलाव किए हैं। यह उत्तर आपके प्रश्न (Map) के लिए भी लागू है।
पैरामीटर प्रकार दोनों अंत में एक ही प्रकार का होना चाहिए।

List<Animal> list = new ArrayList<Animal>(); 
20

जेनिक्स सह-संस्करण नहीं हैं। आप उपयोग कर सकते हैं:

Map<Integer, Map<String, Integer>> myMap = new HashMap<Integer, Map<String, Integer>>(); 
^                ^
--------------^------------------- becomes ------^    | 
       -----------------must remain as type --------------- 

काम के बाहरी बाएं हाथ की ओर Map "बन" जा सकता है एक HashMap के रूप में सौंपा, एक ही किसी भी प्रकार है कि सामान्य पैरामीटर के रूप में प्रकट करने के लिए लागू नहीं किया जा सकता है।

संपादित करें:

Map<Integer, ? extends Map<String, Integer>> myMap = new HashMap<Integer, HashMap<String, Integer>>(); 

ध्यान दें कि यह वाक्य रचना प्रविष्टियों मानचित्र में जोड़े जाने की अनुमति नहीं दी जाएगी, लेकिन एक के रूप में उपयोगी है:

@Keppil द्वारा बताया गया है, आप घिरे वाइल्डकार्ड सिंटैक्स का उपयोग कर सकते हैं विधियों से और पास करने के लिए टाइप करें।

कुछ संदर्भों:

+3

आप 'मानचित्र <इंटीजर,' का उपयोग भी कर सकते हैं? नक्शा <स्ट्रिंग, इंटीजर >> myMap = नया हैश मैप <इंटीजर, हैश मैप <स्ट्रिंग, इंटीजर >>(); ' – Keppil

+2

@ रीमेमस कुछ और स्पष्टीकरण मेरे लिए सहायक होगा .. –

2

इस प्रयास करें:

Map<Integer, HashMap<String, Integer>> myMap = new HashMap<Integer, HashMap<String, Integer>>(); 
3

आप टी की तरह कुछ की जरूरत है उसके:

Map<Integer, Map<String, Integer>> myMap = new HashMap<Integer, Map<String, Integer>>(); 
myMap.put(1, new HashMap<String, Integer>()); 
6

प्रयास करें इस

Map<Integer, ? extends Map<String, Integer>> myMap = new HashMap<Integer, HashMap<String, Integer>>(); 

यह एक सरल उदाहरण

Set<Number> set = new HashSet<Integer>(); 

अनुमति नहीं है पर व्याख्या करने के लिए क्योंकि तब आप पूर्णांकों

की HashSet करने के लिए एक डबल जोड़ सकता है easer है
set.add(1.0) 

नोट वें

Set<? extends Number> set = new HashSet<Integer>(); 

सेट में null पर कुछ भी जोड़ने की अनुमति नहीं देता है। लेकिन आप केवल यह

से नंबर पढ़ सकें, आपको और जानकारी मिल सकती यहाँ http://docs.oracle.com/javase/tutorial/extra/generics/wildcards.html

3

Map<String, Integer>HashMap<String, Integer> के रूप में ही नहीं है। यही समस्या है।

वास्तव में हैश मैप मानचित्र इंटरफ़ेस लागू करता है। तो यह ? extends Map<String, Integer> होना चाहिए

संबंधित मुद्दे