2015-04-01 4 views
8

मैं रॉबर्ट सेडगेविक द्वारा Coursera पर एल्गोरिदम के व्याख्यान के माध्यम से जा रहा था। मैं थोड़ी उलझन में था जब श्री रॉबर्ट ने इंगित किया कि कोई जेनिक्स का उपयोग Arrays के साथ नहीं कर सकता क्योंकि इसकी अनुमति नहीं है। लेकिन संग्रह फ्रेमवर्क में ArrayList आंतरिक सरणी का उपयोग करता है और जेनेरिक डेटाटाइप्स allowed.I कहना है कि हम निम्न कर सकते हैं इसका मतलब यह कर रहे हैं:जावा संग्रह फ्रेमवर्क में आंतरिक रूप से ArrayList का प्रतिनिधित्व कैसे किया जाता है।

public class FixedCapacityStack<Item>{ 
    private Item[] s; 
    private int N = 0; 

public FixedCapacityStack(int capacity) 
{ s = (Item[]) new Object[capacity];} //this hack 

भी वह:

ArrayList<Integer> list = new ArrayList<Integer>(); 

एक हैक उन्होंने बताया कि इस था उल्लेख किया है कि यह एक बदसूरत हैक है और इससे बचा जाना चाहिए और यह संकलन के दौरान चेतावनी भी पैदा करता है।

मेरा प्रश्न है:

1.) कैसे तो ArrayList करता है आंतरिक रूप से विभिन्न जेनेरिक्स प्रकार का प्रतिनिधित्व?

2.) यदि (माना जाता है) वे उपरोक्त वर्णित हैक का उपयोग करते हैं तो क्यों हम चेतावनी नहीं देते हैं जब हम ArrayList के साथ एक प्रोग्राम संकलित करते हैं?

3.) क्या उपरोक्त उस कलाकार के अलावा कोई बेहतर तरीका है?

+1

इससे मदद मिल सकती है: http://docs.oracle.com/javase/tutorial/java/generics/erasure.html – tony200910041

+2

आप स्रोत को भी देख सकते हैं: http://grepcode.com/file/repository.grepcode .com/java/root/jdk/openjdk/7u40-b43/जावा/उपयोग/ArrayList.java/ – user432

+0

'फिक्स्ड कैपेसिटीस्टैक' 'ArrayList' स्रोत कोड (पिछली टिप्पणी में लिंक) में मौजूद प्रतीत नहीं होता है - यह था इसके बजाय व्याख्यान से एक उदाहरण? – DNA

उत्तर

2

स्रोत के अनुसार:

1 - एक Object[] में ArrayList भंडार आइटम, और जब अलग-अलग तत्वों को पुन: प्राप्त मूल्य डाले। वास्तव में एक @SuppressWarnings("unchecked") है जहां कास्ट होता है।

2 - यहां दो जवाब - पहला यह है कि आप (आमतौर पर) ArrayList संकलित नहीं कर रहे हैं, लेकिन जेआरई/जेडीके में rt.jar से अपने क्लासपाथ पर इसे शामिल करें। दूसरा यह है कि ArrayList@SuppressWarnings का उपयोग सामान्य रूप से Object से अपने अनचेक रूपांतरण पर करता है।

3 - अपने अन्य विकल्प ("बेहतर" काफी व्यक्तिपरक है) this question

+0

मुझे यह नहीं मिला। वह –

+0

@ मुस्ताफा उज्जैनवाला क्यों काम नहीं कर सकता क्योंकि यह 'क्लासकास्ट अपवाद' फेंक देगा जैसा कि उन्होंने कहा था। – EJP

+2

यह काम करेगा, 'आइटम []' रनटाइम पर 'ऑब्जेक्ट [] 'में मिटा दिया गया है। – Alex

1

1. में वर्णित है, अपने सामान्य प्रकार के लिए Class की आवश्यकता होती है, और Array.newInstance(Class clazz, int capacity) उपयोग करने के लिए अपने सरणी बनाने के लिए होगा) कैसे क्या ऐरेलिस्ट तब आंतरिक रूप से विभिन्न जेनेरिक प्रकारों का प्रतिनिधित्व करता है?

आपका क्या मतलब है "आंतरिक रूप से"? जेनरिक केवल संकलन समय पर मौजूद हैं। ArrayList पहले से ही आपके लिए किसी और द्वारा संकलित किया गया है और आप बस कक्षा फ़ाइल का उपयोग कर रहे हैं। तो वहां कोई जेनेरिक नहीं है।

विभिन्न जावा लाइब्रेरी कार्यान्वयन स्रोत को अलग-अलग लिख सकते हैं, लेकिन यह आपके लिए कोई चिंता नहीं है। यह "आंतरिक रूप से" एक आंतरिक कार्यान्वयन विस्तार है जो कक्षा के उपयोगकर्ता को परवाह नहीं करना चाहिए।

आप FixedCapacityStack की तरह अपने ही वर्ग में लिखने के लिए थे, तो आप को विभिन्न तरीकों से कर सकता है:

  • आप बात जहां s प्रकार Item[] की है के रूप में आप ऊपर से पता चला है कर सकता है, और आपके द्वारा बनाए एक Object[] और Item[]
  • या आप प्रकार Object[] की s बनाने के लिए और Item टाइप करने के लिए जब आप इसे से बाहर
012 तत्व मिल कास्ट कर सकता डाली

ध्यान दें कि दोनों दृष्टिकोण मिटाने के बाद समान हैं, इसलिए दोनों सटीक बाइटकोड को संकलित करेंगे। अंतर संकलन समय पर सिर्फ शैली है।

दूसरे के पहले दृष्टिकोण का लाभ यह है कि जब आप इससे तत्व प्राप्त करते हैं, तो यह पहले से ही सही प्रकार है, इसलिए आपके पास इन सभी बदसूरत जानवरों के पास हर जगह नहीं है। पहले दृष्टिकोण का नुकसान यह है कि Object[] से Item[] तक प्रारंभिक कास्ट मूल रूप से "झूठ" है, और यह केवल तभी काम करेगा यदि आप पूरी तरह से सुनिश्चित करते हैं कि कक्षा के बाहर s का खुलासा न करें (उदाहरण के लिए कोई विधि नहीं है s प्रकार Item[] के रूप में लौटाता है); अन्यथा आपके पास अप्रत्याशित स्थानों में कक्षा कास्ट अपवाद होगा।

2.) अगर (माना जाता है) वे उपरोक्त वर्णित हैक का उपयोग करते हैं तो क्यों हम चेतावनी नहीं देते हैं जब हम ArrayList के साथ एक प्रोग्राम संकलित करते हैं?

केवल एक चेतावनी होगी जब आप वास्तव में संकलित इस कक्षा में संकलित करें। लेकिन अगर यह पहले ही संकलित नहीं हुआ था और आप केवल क्लास फ़ाइल का उपयोग कर रहे हैं। वास्तव में, आपके पास आमतौर पर ArrayList का स्रोत भी नहीं होता है।

3.) क्या उपरोक्त उस कलाकार के अलावा कोई बेहतर तरीका है?

"बेहतर" से आपका क्या मतलब है, इस पर निर्भर करता है। मैंने दो दृष्टिकोण और प्रत्येक के फायदे और नुकसान दिखाए हैं।

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

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