2015-09-07 9 views
7

मैंने पढ़ा है कि जावा 7 के बाद से, पहले कथन में दाएं तरफ के प्रकार को निर्दिष्ट करने के साथ संग्रह बनाना खराब शैली है क्योंकि कंपाइलर बाएं तरफ से प्रकार का अनुमान लगा सकता है।जेनिक्स ऑपरेटर को छोड़ते समय टाइप क्यों नहीं किया जाता है

List<Integer> myList = new ArrayList<Integer>(); 

मेरा प्रश्न जब इस तरह सूची आरंभ, संकलक प्रकार नहीं मिल रहा है और मैं एक अनियंत्रित प्रकार चेतावनी मिलती है:

List<Integer> myList = new ArrayList(); 

उत्तर

12

संकलक, क्योंकि आप एक कच्चेArrayList instantiating कर रहे हैं, नहीं अनुमान प्रकार करता है। लेकिन यह आपको चेतावनी देने के लिए पर्याप्त स्मार्ट है कि इस (कच्चे) ऑब्जेक्ट के साथ काम करते समय समस्या हो सकती है।

इस चेतावनी के पीछे कारण का उल्लेख करना उचित है। type erasure के कारण, List के बारे में पैरामीट्रिक जानकारी (<Integer>) पूरी तरह से रनटाइम पर चली जाएगी, जब परिवर्तक Object प्रकार के तत्व रखेगा। इस स्निपेट पर विचार करें:

List rawList = new ArrayList(); //raw list 
rawList.add(new String("hello")); 
rawList.add(new Double(12.3d)); 
List<Integer> intList = rawList; // warning! 

यह स्निपेट संकलन होगा, लेकिन कुछ चेतावनी उत्पन्न होगा। कच्ची सूची (rawList) होने पर, आप String, Double इत्यादि सहित किसी भी गैर-आदिम प्रकार को सूची में जोड़ सकते हैं, लेकिन इस संग्रह को किसी सूची में निर्दिष्ट करते समय, जिसे केवल पूर्णांक रखने के लिए निर्दिष्ट किया गया है, तो यह एक है मुसीबत। रनटाइम पर intList से कुछ तत्व लाने की कोशिश करते समय आपको ClassCastException मिलेगा, जो Integer माना जाता है, लेकिन वास्तविकता में String या कुछ और है।

लंबी कहानी लघु - जेनिक्स के साथ कच्चे प्रकार का मिश्रण न करें!

आपके मामले में, संकलक संभवतः, प्रकार का अनुमान लगाया है होगा यदि आप हीरा का इस्तेमाल किया है:

List<Integer> list = new ArrayList<>(); //¯\_(ツ)_/¯ 
            ↑↑ 
9

क्योंकि आप कोण कोष्ठक भूल गए हैं (हीरा ऑपरेटर कहा जाता है)।

List<Integer> myList = new ArrayList<>(); 

इस वाक्य रचना

List<Integer> myList = new ArrayList<Integer>(); 

के बराबर है, लेकिन 3 आप कह रहे हैं कि दाईं ओर एक कच्चे प्रकार ArrayList अर्थ हर वस्तु पकड़ कर सकते हैं में

List<Integer> myList = new ArrayList(); 

से अलग है (न केवल इंटीजर)। जेनेरिक बस समय संकलित कर रहे हैं और सहेजने के प्रकार में संकलित हैं।

+0

क्यों इस संकलक सूची की तुलना में अधिक जानकारी MyList = नए ArrayList() बाईं ओर के बाद से देता है सामान्य जानकारी availabe – PKuhn

+0

है क्योंकि दोनों शब्दार्थ अलग हैं। हीरा में प्रकार को छोड़ना सिंटैक्टिक सुझाव है। – lschuetze

2

JLS (§15.9) में विनिर्दिष्ट आप हीरा ऑपरेटर का उपयोग कर सकते घोषणा से प्रकार अनुमान लगाने के लिए,।

एक वर्ग उदाहरण निर्माण अभिव्यक्ति निर्दिष्ट करता है एक वर्ग instantiated किया जाना है, संभवतः प्रकार तर्क (§4.5.1) या एक हीरे ("<>") यदि वर्ग instantiated जा रहा है के बाद (सामान्य है §8.1.2), उसके बाद (संभवतः खाली) कन्स्ट्रक्टर को वास्तविक मूल्य तर्कों की सूची।

List<Integer> myList = new ArrayList<>(); 
7

https://docs.oracle.com/javase/7/docs/technotes/guides/language/type-inference-generic-instance-creation.html से:

ध्यान दें कि सामान्य वर्ग इन्स्टेन्शियशन दौरान स्वत: प्रकार निष्कर्ष का लाभ लेने के लिए, आप हीरे का उल्लेख करना होगा। [...] HashMap() कन्स्ट्रक्टर HashMap कच्चे प्रकार, Map<String, List<String>> प्रकार से संदर्भित करता है।

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