2013-01-08 23 views
19

संभव डुप्लिकेट:
ArrayList is a raw type. References to generic type ArrayList<E> should be parameterizedचेतावनी ArrayList एक कच्चा प्रकार है। सामान्य प्रकार ArrayList <E> के सन्दर्भ पैरामिट्रीकृत होना चाहिए

आदेश एक सदस्य द्वारा किया गया भुगतान के साथ एक ArrayList मैं भुगतान आईडी की सूची को बदलना चाहते हैं बचाने के लिए एक स्ट्रिंग में, इसलिए मैंने निम्न विधि बनाई:

public String fromArraytoString(ArrayList items){ 
     JSONObject json = new JSONObject(); 
     json.put("uniqueArrays", new JSONArray(items)); 
     return json.toString(); 
      } 

लेकिन मुझे इसके लिए मिलता है चेतावनी चेतावनी:

ArrayList is a raw type. References to generic type ArrayList<E> should be parameterized 

क्या कोई मुझे समझा सकता है क्यों?

उत्तर

39

आप निश्चित रूप से जावा जेनरिक पर इस ट्यूटोरियल पढ़ना चाहिए: http://docs.oracle.com/javase/tutorial/java/generics/

संक्षेप में:

कई जावा वर्गों और प्रकार (जेनेरिक वर्ग या जेनेरिक प्रकार), आमतौर पर संग्रह, टाइप कहा जाता है इस तरह के ArrayList<E> में E के रूप में ई मापदंडों, (E सिर्फ एक मनमाना चुना नाम है, अन्य वर्गों T के रूप में यह नाम या जो कुछ भी):

public class ArrayList<E> extends ... { 

    public E get(int index) { ... } 

    public boolean add(E element) { ... } 

    // other methods... 
} 

अब, जब आप इस तरह के वर्ग का एक उदाहरण बनाने के लिए, आप एक ठोस परिभाषित अब से

ArrayList<String> stringList = new ArrayList<String>(); 

, सभी E रों String द्वारा "की जगह" कर रहे हैं 01 के लिए: प्रकार पैरामीटर का मान उदाहरण String के लिए, (E आमतौर पर आप चाहते हैं जो कुछ भी प्रकार के लिए मूल्यांकन किया जा सकता)परिवर्तनीय, ताकि आप केवल स्ट्रिंग्स जोड़ सकें और केवल स्ट्रिंग प्राप्त कर सकें। आप के लिए संकलक जांच करता है कि आप गलती से किसी दूसरे प्रकार का ऑब्जेक्ट न जोड़ें:

stringList.add(Integer.valueOf(1)); 
// compile error - cannot add Integer to ArrayList of Strings 

हालांकि, क्योंकि जेनरिक जावा 5 में जोड़ा गया था, यह अभी भी संभव है पश्च संगतता के लिए उनके बिना कोड लिखने के लिए । तो आप लिख सकते हैं:

ArrayList list = new ArrayList(); 

लेकिन आप सभी प्रकार की जांच लाभ खो देते हैं। विधि हस्ताक्षर में E एस बस Object एस बन गया है।

list.add(Integer.valueOf(42)); // adding an Integer 
list.add("aaa"); // adding a String 

Object something = list.get(0); // unknown type of returned object, need to cast 
Integer i0 = (Integer) something; // this unsafe cast works... 
Integer i1 = (Integer) list.get(1); // but this fails with a ClassCastException 
// because you cannot cast a String to Integer 

तथ्य यह है कि एक कच्चे प्रकार (कि छोड़े गए अपनी तरह के मानकों के साथ एक सामान्य प्रकार है) का उपयोग कर असुरक्षित है, चेतावनी आप मिल गया है के लिए कारण है। ArrayList के बजाय, ArrayList<String> या ArrayList<Integer> या जो भी items का प्रकार है उसका उपयोग करें।

+0

वाह इस के लिए धन्यवाद! बहुत स्पष्ट स्पष्टीकरण @ नोटिक्स। +1 – KarenAnne

+1

कैन आप पूछे गए प्रश्न के लिए सही समाधान देते हैं? – Satish

4

ArrayList में किस तरह की वस्तुओं को संग्रहीत किया जाता है? आपको इसे घोषणा में जोड़ना होगा। यह हमेशा

ArrayList<Type> 

तो अगर यह JSONObjects की एक सूची है, तो आप

ArrayList<JSONObject> 

आशा है कि मदद करता है जाते थे।

1

ऐसा इसलिए है क्योंकि जावा कंपाइलर आपके लिए कुछ जांच करने की कोशिश करता है। जिस तरह से आपने इसे लिखा है, वह प्रभावी ढंग से कंपाइलर को बताता है कि आपको ऑब्जेक्ट के ऑरेस्टिस्ट को पैरामीटर के रूप में प्राप्त होगा। यह आपको केवल उन ऑब्जेक्ट्स के वर्ग को निर्दिष्ट करने के लिए प्रोत्साहित करता है जिन्हें आप ArrayList में स्टोर करना चाहते हैं। ArrayList<MyClass> या ArrayList <?> निर्दिष्ट करना चेतावनी से छुटकारा पा जाएगा। दूसरा संस्करण प्रभावी ढंग से संकलक को बताता है कि आप कक्षा के ऑब्जेक्ट्स के ऐरेलिस्ट को संकलित समय पर ज्ञात नहीं करेंगे।

मुझे लगता है कि जावा में जेनेरिक के बारे में कुछ पढ़ने के लिए यह उपयोगी हो सकता है। http://docs.oracle.com/javase/tutorial/java/generics/

1

JsonArray रों प्रकार निर्दिष्ट प्रकार के बिना ArrayList हैं (यानी कच्चे प्रकार) है के निर्माता, जबकि items, पैरामीटर T साथ एक सामान्य प्रकार Collection प्राप्त करने की उम्मीद '। आप इस सवाल जाँच कर सकते हैं कच्चे प्रकार के बारे में कुछ विचार प्राप्त करने: What is a raw type and why shouldn't we use it?

समाधान 1 (अनुशंसित): पैरामीटर T साथ items पास या इस तरह के String के रूप में ठोस प्रकार निर्दिष्ट करें। यह प्रश्न आपकी विशिष्ट समस्या में आपकी सहायता कर सकता है: convert ArrayList<MyCustomClass> to JSONArray

समाधान 2: fromArraytoString विधि से पहले @SuppressWarnings("unchecked") जोड़ें। यह अनुशंसित नहीं है, लेकिन आप इस सवाल का उल्लेख कर सकते हैं: What is SuppressWarnings ("unchecked") in Java?

+0

धन्यवाद, मेरे पास आईडी की एक सूची है (मान लें, 1, 2, 3 ...) जो डेटाबेस में सभी भुगतान हैं। मैं बस डेटाबेस की इस सूची को डेटाबेस में एक ArrayList में संग्रहीत करना चाहता हूं। क्या आप मुझे एक छोटा सा उदाहरण दे सकते हैं? – Diego

+0

बस 'एर्रेटोस्ट्रिंग (ऐरेलिस्ट आइटम)' से 'अरेस्ट्रोस्ट्रिंग (ऐरेलिस्ट आइटम) में बदल रहा है' 'काम कर सकता है (यदि आपके आइटम सभी' स्ट्रिंग 'प्रकार हैं। –