2012-02-29 28 views
8

सामान्य सरणी सूची प्रारंभ में, हम इस प्रकार सामान्य प्रकार को परिभाषित करने के लिए इस्तेमाल किया,जेनेरिक प्रकार

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

लेकिन ArrayLists की ArrayList के मामले में, हम अपने सामान्य प्रकार को कैसे परिभाषित कर सकते हैं?

सरणी सूचियों की सरणी सूची के लिए कोड इस प्रकार है:

ArrayList[] arr=new ArrayList[n]; 
for(int i=0;i<n;i++) 
{ 
arr[i]=new ArrayList(); 
} 

बस, वाक्य रचना को साझा करता है, तो किसी को भी इसके बारे में पता नहीं है ..!

+3

यह ArrayList ऑब्जेक्ट्स का एक ** सरणी ** है –

+0

धन्यवाद एंड्रियास .., अब तक मैंने सोचा कि यह ऐरेलिस्ट की एक ऐरेलिस्ट है, अब मुझे यह मिला है कि यह ArrayList ऑब्जेक्ट का एक ऐरे है ..! ठीक है तो हम उस के लिए सामान्य प्रकार कैसे परिभाषित कर सकते हैं ..? कोई विचार..? –

+0

मेरा जवाब देखें। यह मुमकिन नहीं है। जावा के साथ कोई सामान्य सरणी नहीं। –

उत्तर

12

आप बस

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

कर सकते हैं आप सूचियों की एक सरणी की जरूरत है, तो आप

List<String>[] l = new List[n]; 

करते हैं और सुरक्षित रूप से उपेक्षा या चेतावनी को दबाने कर सकते हैं।

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

हम सामान्य सरणियों नहीं बना सकते:

+1

"चेतावनी को सुरक्षित रूप से अनदेखा या दबाएं।"मुझे लगता है कि लेखन कोड जानबूझकर चेतावनी का कारण बनता है" सुरक्षित "माना जाना चाहिए। –

+1

@ टॉमहॉविन-tackline यह काफी सुरक्षित है। नई सरणी में कोई सूची वस्तु नहीं है, इसलिए इसमें कोई सूचियां नहीं हैं जो 'सूची ' नहीं हैं। कंपाइलर बस इसे पहचानने के लिए पर्याप्त चालाक नहीं है। (और इसे spec द्वारा अधिक चालाक होने की अनुमति नहीं है।) यदि आप सूचियों की एक सरणी चाहते हैं (संकेत या अवरोध से बचने के लिए, कहते हैं), वहाँ है चेतावनी के बिना ऐसा करने का कोई तरीका नहीं। –

+0

आपको बकवास के साथ संकलक सौदे को देने के बजाय तर्क की एक पंक्ति पर भरोसा करना है।/जैसा कि होता है 'एल' में 'सूची ' जोड़ा जा सकता है, हालांकि हाल के कंपाइलर्स आपको एक और ("कच्ची प्रकार" चेतावनी दें। –

4

आप (वास्तव में) सूचियों की एक सूची चाहते हैं, तो यह सही घोषणा है। new List<String>[0] एक संकलन त्रुटि है।

0

कुछ इस तरह:

List<List<Number>> matrix = new ArrayList<List<Number>>(); 
for (int i = 0; i < numRows; ++i) { 
    List<Number> row = new ArrayList<Number>(); 
    // add some values into the row 
    matrix.add(row); 
} 

भीतरी सूची कुछ भी आप चाहते हैं के प्रकार करते हैं; यह केवल चित्रकारी उद्देश्यों के लिए है।

0

आप सूचियों की एक सरणी के बारे में बात कर रहे हैं (ArrayLists अधिक विशिष्ट होने के लिए)। जावा जेनेरिक सरणी पीढ़ी की अनुमति नहीं देता है (वाइल्डकार्ड का उपयोग करते समय, अगले पैराग्राफ देखें)। तो आपको या तो सरणी के लिए जेनिक्स का उपयोग करना भूल जाना चाहिए, या किसी सरणी के बजाय सूची का उपयोग करना चाहिए (इसके लिए प्रस्तावित कई समाधान)।

IBM article से

उद्धरण:

तथ्य यह है कि सरणियों covariant हैं, लेकिन जेनरिक नहीं हैं का एक और परिणाम यह है कि आप एक सामान्य प्रकार की एक सरणी का दृष्टांत नहीं कर सकता है (नई सूची [3] गैर-कानूनी है), जब तक टाइप तर्क एक unbounded वाइल्डकार्ड है (नई सूची <?> [3] कानूनी है)।

0

आप सही हैं: यह पागल दिखता है। (इसके मई एक बग ...) इसके बजाय

का उपयोग करने के
ArrayList<String>[] lst = new ArrayList<String>[]{}; 

उपयोग:

ArrayList<String>[] list1 = new ArrayList[]{}; 

घोषणा के लिए काम करेंगे, भले ही आप एक congrete सामान्य वर्णन न!

+1

आप एक अज्ञात वर्ग क्यों बना रहे हैं? – newacct

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