/ / स्ट्रिंगर ArrayList में एक Integer को कैसे जोड़ा जा सकता है? - जावा, सरणी सूची

एक स्ट्रिंग ArrayList में एक इंटीजर जोड़ा जा सकता है? जावा, सरणीसूची

List list = new ArrayList<String>() ;
list.add(1) ;
Integer hello = (Integer) list.get(0) ;
System.out.println(hello);

उपरोक्त कोड में एक प्रकार का संदर्भ है सूची एक उदाहरण का जिक्र करते हुए सारणी सूची प्रकार के तार। जब रेखा list.add(1) निष्पादित किया जाता है, isn "t 1 को ArrayList (प्रकार स्ट्रिंग) में जोड़ा गया है? यदि हाँ, तो इसकी अनुमति क्यों है?

उत्तर:

उत्तर № 1 के लिए 15

आपने टाइप इरेज़र का उपयोग किया है, जिसका अर्थ है कि आपने पहले से सेट किए गए सामान्य चेक को अनदेखा कर दिया है। आप इसे इस तरह से दूर कर सकते हैं क्योंकि जेनरिक एक संकलित समय विशेषता है जो रनटाइम पर जाँच नहीं की जाती है।

आपके पास जैसा है वैसा ही है

List list = new ArrayList() ;
list.add(1) ;
Integer hello = (Integer) list.get(0) ;
System.out.println(hello);

या

List<Integer> list = new ArrayList<Integer>() ;
list.add(1) ;
Integer hello = list.get(0); // generics add an implicit cast here
System.out.println(hello);

यदि आप संकलक द्वारा उत्पन्न बाइट कोड को देखते हैं, तो अंतर बताने का कोई तरीका नहीं है।

दिलचस्प है, आप ऐसा कर सकते हैं

List<String> strings = new ArrayList<String>();
@SuppressWarnings("unchecked");
List<Integer> ints = (List) strings;
ints.add(1);

System.out.println(strings); // ok
String s= strings.get(0); // throws a ClassCastException

जवाब के लिए 12 № 2

समस्या यह है कि आपका list चर में एक कच्चा प्रकार होता है और आप इस सूची में किसी भी प्रकार की वस्तुओं को जोड़ सकते हैं। समस्या को हल करने के लिए इसे घोषित करें List का String"S:

List<String> list = new ArrayList<String>() ;

जवाब के लिए 3 № 3

यह घोषणा के कारण संकलित करता है List list कच्चे प्रकार का उपयोग करता है List, बाध्य प्रकार नहीं List<String>। दूसरी पंक्ति संकलन करती है क्योंकि आपकी list चर कुछ भी स्वीकार कर सकते हैं। तीसरी पंक्ति संकलन करती है क्योंकि list.get(0) रिटर्न Object। चौथी पंक्ति में विफल होने का कोई कारण नहीं है।

संयोग से, संकलित कोड में कुछ भी नहीं होने के कारण Integer 1 को कास्ट किया जा सकता है String। लेकिन आपको उस पर निर्भर नहीं होना चाहिए। पहली पंक्ति उचित थी

List<String> list = new ArrayList<>();

संकलन के समय आपकी गलती पकड़ी गई होगी।


जवाब के लिए 3 № 4

जब आप इस तरह एक सूची घोषित करते हैं: List list = new ArrayList<String>() ;

आप एक रॉ टाइप नाम का उपयोग कर रहे हैं। यह एक प्रकार है, जिसमें सामान्य प्रकार का पैरामीटर होता है, जैसे सूची, लेकिन आप एक की आपूर्ति करने में विफल रहे। यदि आप संकलक चेतावनियों की जांच करते हैं, तो आप देखेंगे कि यह आपको इस बारे में बता रहा है। कच्चे प्रकार के साथ मानकीकृत प्रकारों को मिलाना आमतौर पर एक प्रोग्रामिंग त्रुटि माना जाता है। यह ठीक है:

List<String> list = new ArrayList<String>() ;

और यह ठीक है (लेकिन अप्रचलित है):

List list = new ArrayList();

लेकिन जिस तरह से आपने इसे लिखा है, उससे बचना चाहिए।

समस्या यह है कि जेनरिक को केवल कंपाइलर समय पर जांचा जाता है, और आपने कंपाइलर को बताया List, नहीं List<String>, तो यह आपको वहाँ कुछ भी आप चाहते हैं डाल देगा! तथ्य यह है कि सही पक्ष के पास पैरामीटर वास्तव में कुछ भी नहीं है, यह संकलक के लिए वास्तविक संदर्भ का प्रकार है।


जवाब के लिए 0 № 5
List list = new ArrayList<String>() ; // WARNING!!!

एक असुरक्षित सूची एक सुरक्षित ArrayList को संदर्भित करती है

list.add(1) ;  // WARNING!!!

एक इंटेगर (इंट 1 को परिवर्तित कर दिया गया है ऑटोबॉक्सिंग) सूची में जोड़ा गया स्ट्रिंग नहीं

Integer hello = (Integer) list.get(0) ;

कास्टिंग की आवश्यकता है क्योंकि असुरक्षित सूची में कुछ भी हो सकता है।

System.out.println(hello);

Integer.toString () कहा जाता है

जब लाइन की सूची .add (1) निष्पादित होती है, तो isn "t 1 को ArrayList (प्रकार स्ट्रिंग) में जोड़ा जाता है?

हाँ। इंटेगर को एक एरेलेस्ट में जोड़ा गया था जो स्ट्रिंग को शामिल करने वाला है।

यदि हाँ, तो इसकी अनुमति क्यों है?

अनिच्छुक अनुकूलता। जावा को प्री-जेनेरिक कोड का समर्थन करना है।

सूची सूची; इसका मतलब है कि यह असुरक्षित है इसलिए आप इसके साथ कुछ भी कर सकते हैं और संदर्भित ArrayList () को इसे सहन करना होगा।

नैतिक: "संकलक चेतावनी को अनदेखा न करें अन्यथा इंटेगर एक एरेलेस्ट में प्रवेश कर सकता है जिसे स्ट्रिंग्स को शामिल करना चाहिए।


उत्तर के लिए -1 № 6

हां ... 1 को ऐरे में जोड़ा जाता है, क्योंकि जावा अन्य भाषाओं की तरह, आदिम डेटा प्रकारों के निहित (स्वचालित) रूपांतरण (कास्टिंग) को लागू करता है।

यहां अधिक जानकारी बातचीत और प्रचार


उत्तर के लिए -3 № 7

इसे इस्तेमाल करे

List.add(Integer.toString(1));

आप भी इसे आजमा सकते हैं

List list = new ArrayList<Object>() ;

अगर कोई जरूरत नहीं है कि arraylist स्ट्रिंग का एक Arraylist होना चाहिए


-4 उत्तर के लिए for 8

नहीं, क्योंकि जावा देखता है 1 एक ग्राहक के रूप में। आपको अपने नंबर को पहले स्ट्रिंग के रूप में बदलना होगा Integer.toString(n)