जावा जेनरिक सरणियों में क्यों नहीं हो सकता है?


10

ऐसा क्यों है कि जब मैं ऐरेलेस्ट्स की एक सरणी बनाने की कोशिश करता हूं: ArrayList<Integer>[] arr=new ArrayList<Integer>[40];एक त्रुटि है और जावा यह अनुमति नहीं देता है?

क्या जावा के जेनेरिक को लागू करने, किसी भी भाषा में जेनेरिक, या कुछ मनमानी से संबंधित है?


जवाबों:


20

यह जावा के जेनरिक में प्रमुख छेद में से एक है, सरणियों हैं covariant , जिसका अर्थ है कि प्रकार की एक सरणी Foo[]के एक उपवर्ग है Object[]और ParentOfFoo[]। इसके विपरीत List<Foo>जिसमें यह व्यवहार नहीं है।

यह तब महत्वपूर्ण था जब जावा में जेनरिक (जावा 5 तक) नहीं था क्योंकि अन्यथा, जेनेरिक सॉर्टिंग फ़ंक्शन जैसा कुछ असंभव था।

हालाँकि, यह इस मुश्किल समस्या है कि arrays पता है कि वे किस प्रकार रनटाइम पर हैं । हालांकि जावा में जेनेरिक प्रकार के क्षरण पर आधारित है। ये दो चीजें बिल्कुल ठीक नहीं होती हैं और यही हमारी समस्या है।

तो यह लंबी और छोटी है, जावा 1 में, सहसंयोजक सरणियों ने आंशिक रूप से उस छेद को भर दिया जो जेनरिक की कमी थी। हालांकि जब उन्होंने इस छेद को ठीक से भरने की कोशिश की, तो बैकवर्ड संगतता का मतलब था कि सरणियों को लागू करना बहुत असंभव था।

वास्तव में, जिस व्यक्ति ने वास्तव में जेनरिक के लिए रूपरेखा तैयार की थी, मार्टिन ओडस्की ने एक साक्षात्कार के दौरान यहां इस बारे में बात की कि उन्होंने स्काला क्यों बनाया। (यदि आप स्काला के इतिहास में रुचि रखते हैं तो बहुत ही आकर्षक)


3

क्या जावा के जेनेरिक को लागू करने, किसी भी भाषा में जेनेरिक, या कुछ मनमानी से संबंधित है?

दरअसल, यह कुछ हद तक मनमाना है।

समस्या यह है कि यह टाइप सिस्टम में एक छेद की अनुमति देता है, क्योंकि ArrayList<T>[]इसे कास्ट किया जा सकता है Object[]और फिर आप ArrayList<U>एरे में डाल सकते हैं , जहां U != T

जावा डिजाइनरों ने इस छेद को यथासंभव उत्सुकता से अवरुद्ध करने का फैसला किया, बिल्कुल भी अनुमति नहीं दी new ArrayList<T>[N]

हालाँकि, इसे जेनेरिक (बिना "अनियंत्रित" चेतावनी) के सरणियों के अपस्टेकिंग की अनुमति नहीं देकर भी प्लग किया जा सकता था।


यह उत्तर रेखांकित है। बहुत सरल और अस्पष्ट शब्दों पर शब्दजाल का उपयोग नहीं करता है। बहुत बहुत धन्यवाद।
तुंग गुयेन

आप पर विस्तृत करने के लिए चाहते हो सकता है कि क्यों इस मामले में जहां आपके पास डाल करने के लिए अलग है Integerएक में Object[]वास्तव में एक बात यह है किString[]
Caleth

-3

क्योंकि सरणी सहसंयोजक है जो प्रत्येक प्रकार वस्तु का एक उपवर्ग है इसलिए यह कास्टिंग अपवाद के कारण रन टाइम में त्रुटि देता है। जबकि जेनेरिक अपरिवर्तनशील होता है, इसलिए जब वह टाइप सुनिश्चित करता है या टाइप-सेफ बनाता है, तो यदि वह टाइप नहीं करता है तो वह टाइप करने वाला त्रुटि देता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.