2012-01-11 14 views
5

तो मैं एक मानचित्र इसमें कुछ मूल्यों है कि एक विधि में पारित किया जा रहा है में लाना:एक मानचित्र <String, ?>

public String doThis(Map<String, ?> context){ 
..... 
} 

और मैं इस मानचित्र

String abc="123"; 
context.put("newAttr",abc); 
के अतिरिक्त विशेषता सम्मिलित करने के लिए कोशिश कर रहा हूँ

The method put(String, capture#8-of ?) in the type Map is not applicable for the arguments (String, String)

है वैसे भी "क्लोनिंग" मानचित्र के बिना इस पुट प्रदर्शन करने के लिए वहाँ:

लेकिन मैं इस त्रुटि मिल रहा है?

+0

क्या आप कोई नक्शा बनाने की कोशिश कर रहे हैं जो किसी भी प्रकार की वस्तु को स्टोर कर सके? – Perception

उत्तर

11

यदि आप टाइप जे के मान को सामान्य जेनर Map में रखना चाहते हैं तो आपको Map को Map<String, ? super X> के रूप में घोषित करने की आवश्यकता है। अपने उदाहरण में एक्स String है, इसलिए:

public String doThis(Map<String, ? super String> context){ 
..... 
} 

Map<String, ? super X> का अर्थ है: प्रकार String की कुंजी और एक प्रकार है जो है एक्स या एक्स का एक सुपर-प्रकार इस तरह के सभी नक्शे String स्वीकार करने के लिए तैयार कर रहे हैं के मूल्यों के साथ एक नक्शा कुंजी के रूप में कुंजी और एक्स उदाहरण के रूप में उदाहरण।

+1

+1, लेकिन आपके अंतिम अनुच्छेद में एक टाइपो है: आपका मतलब 'विस्तार' के बजाय 'सुपर' है। :-) – ruakh

+0

@ruakh वास्तव में। धन्यवाद। –

+0

अच्छा। धन्यवाद। – ovaherenow

4

पीईसीएस (निर्माता विस्तार, उपभोक्ता सुपर) याद रखें। आपके पास एक उपभोक्ता है (डालने), इसलिए यह extends नहीं हो सकता है।

0

आश्चर्य की बात है कि हम इस मानचित्र को रूप में उपयोग करने में आसान बना सकते हैं। बस इस सरल वाक्यविन्यास के साथ: (Map<String, ObjectOrSth>)unfriendlyMap

// Let's get this weird map. 
HashMap<String, String> mapOrig = new HashMap<String, String>(); 
Map<String, ?> mapQuestion = (Map<String, ?>)mapOrig; 
//mapQuestion.put("key2", "?"); // impossible 

// Convert it to almost anything... 
Map<String, String> mapStr2 = (Map<String, String>)mapQuestion; 
mapStr2.put("key2", "string2"); 
assertThat(mapOrig.get("key2")).isEqualTo("string2"); 
Map<String, Object> mapObj = (Map<String, Object>)mapQuestion; 
mapObj.put("key3", "object"); 
assertThat(mapOrig.get("key3")).isEqualTo("object"); 
संबंधित मुद्दे