2010-05-28 14 views
8
Map session = ActionContext.getContext().getSession(); 
session.put("user", user); 

यह कोड एक चेतावनी उत्पन्न करता है: टाइप सुरक्षा: विधि (ऑब्जेक्ट, ऑब्जेक्ट) कच्चे प्रकार के मानचित्र से संबंधित है। जेनेरिक प्रकार के संदर्भ < के, वी> पैरामीटर होना चाहिए। प्रकार सुरक्षा:इस जावा प्रकार की सुरक्षा चेतावनी को कैसे हल करें?

Map<String, Serializable> session = (Map<String, Serializable>)ActionContext.getContext().getSession(); 
session.put("user", user); 

इस कोड को एक चेतावनी उत्पन्न अनियंत्रित मानचित्र से डाली मानचित्र < स्ट्रिंग, Serializable>

getSession विधि Struts2 से संबंधित है इसलिए मैं इसे संशोधित नहीं कर सकता। मैं @SuppressWarnings का उपयोग करने से बचना चाहता हूं क्योंकि अन्य चेतावनियां उपयोगी हो सकती हैं।

मुझे लगता है कि दुनिया में सभी स्ट्रूट 2 उपयोगकर्ताओं को एक ही समस्या का सामना करना पड़ा ... क्या कोई सुरुचिपूर्ण समाधान है?

उत्तर

8

मैं वहाँ किसी भी अन्य तरीके लेकिन @SuppressWarnings है नहीं लगता है ("अनियंत्रित")। मेरा मानना ​​है कि आप इसे प्रश्न में लाइन से ऊपर रख सकते हैं, और यह केवल उस पंक्ति को दबाएगा।

संपादित करें: आप Map<?, ?> session = ActionContext.getContext().getSession(); भी कर सकते हैं लेकिन मुझे यकीन नहीं है कि आप इसे कैसे करना चाहते हैं; आप इस तरह से मानचित्र में कुछ भी नहीं डाल पाएंगे (क्योंकि संकलक आप जो भी डाल रहे हैं उसके प्रकार की जांच नहीं कर सकते हैं), केवल इसे पढ़ें।

0

क्या होगा यदि आप इसे इस तरह कार्य करें:

Map<String, Serializable> session = ActionContext.getContext().getSession(); 
+0

यह एक और चेतावनी देता है::

तो सही प्रारूप निम्नलिखित है प्रकार की सुरक्षा: प्रकार मानचित्र की अभिव्यक्ति मानचित्र के अनुरूप अनियंत्रित रूपांतरण की जरूरत है < स्ट्रिंग, Serializable> –

1

स्ट्रूट्स 2 का विशेष संस्करण (विशेष रूप से XWork) क्या आप उपयोग कर रहे हैं?

Map<String, Object> session = ActionContext.getContext().getSession(); 
+0

ऐसा नहीं है? मुझे चेतावनी मिलती है (या यह एक त्रुटि थी?) अगर मैं नहीं डालता ... – helios

+0

मैं 2.1.8.1 का उपयोग करता हूं जो नवीनतम संस्करण है। आपका सुझाव इस चेतावनी देता है: सुरक्षा टाइप करें: प्रकार मानचित्र की अभिव्यक्ति को मानचित्र <स्ट्रिंग, ऑब्जेक्ट> –

+1

http://struts.apache.org/2.1.8.1/struts2-core/apidocs/com/opensymphony के अनुरूप अनचेक रूपांतरण की आवश्यकता है /xwork2/ActionContext.html ऐसा लगता है कि 2.1.8.1 getSession को पैरामीटरयुक्त मानचित्र वापस करना चाहिए। क्या आप वाकई ठीक से स्थापित हैं और पहले स्थापित पुराने संस्करण का उपयोग नहीं कर रहे हैं? –

3

सबसे सुरक्षित, सबसे कुशल इस से निपटने के लिए जिस तरह से शायद है:

Map<String, Serializable> session = (Map<String, Serializable>)ActionContext.getContext().getSession(); 
session.put("user", user); 

Cannot cast from Map<String,Object> to Map<String,Serializable>. 

यह, दूसरे हाथ पर, काम करता है और कोई चेतावनी देता है: मेरे लिए, अपने निम्नलिखित कोड एक त्रुटि देता है:

Map<?, ?> session = ActionContext.getContext().getSession(); 

और उसके बाद सत्र मानचित्र से पुनर्प्राप्त वस्तुओं को कास्ट करें।

@SuppressWarnings दृष्टिकोण वास्तव में संकलित कोड में समान होगा जो समान है। हालांकि टाइप कास्ट निहित होगा; यानी स्रोत कोड को देखकर स्पॉट करना आसान नहीं होगा। और @SuppressWarnings एनोटेशन (hypothetically) कुछ अन्य चेतावनी को उसी कोड ब्लॉक में चेतावनी दे सकता है जो वास्तविक त्रुटि का प्रतिनिधित्व करता है; यानी एक जिसके परिणामस्वरूप छिपे हुए टाइपकास्ट में से एक, रनटाइम पर असफल हो जाएगा।

अन्य अधिक महंगा विकल्प शामिल हैं:

  • एक नया Map<String, Serializable> उदाहरण क्रमशः String और Serializable लिए कुंजियाँ और मान कास्टिंग के लिए Map<?, ?> से प्रवेश की नकल करके प्रविष्टि, या

  • एक सामान्य विधि निम्नानुसार टाइपकास्ट सुरक्षित रूप से करता है।


@SuppressWarnings("unchecked") 
public <K,V> Map<K,V> castMap(Map<?, ?> map, Class<K> kClass, Class<V> vClass) { 
    for (Map.Entry<?, ?> entry : map.entrySet()) { 
     kClass.cast(entry.getKey()); 
     vClass.cast(entry.getValue()); 
    } 
    return (Map<K,V>) map; 
} 
0

यह आप मूल्य parameterize करने का अनुरोध करता है, तो मूल्य की जरूरत है मापदंडों फिर उन्हें पारित किया गया है।

उदाहरण

Map<Integer, Map> vCombinedCodeMap = new HashMap<>(); 

के लिए "पैरामिट्रीकृत" Map<Integer, Map> के लिए चेतावनी दे देंगे। ,

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

के बाद के रूप में कास्ट

public void setSession(Map<String, Object> sessionMap) { 

    // TODO Auto-generated method stub 

    this.sessionMap = (SessionMap<String, Object>) sessionMap; 
} 
संबंधित मुद्दे