मैंने सुना है कि जेनरिक का जावा कार्यान्वयन सी # कार्यान्वयन के समान नहीं है। उसमें सिंटैक्स समान दिखता है, जावा कार्यान्वयन के बारे में क्या घटिया है, या यह एक धार्मिक दृष्टिकोण है?सी # बनाम जावा जेनरिक
उत्तर
streloksi's link मतभेद टूट का एक बड़ा काम करता है। त्वरित और गंदी सारांश यह है ...
वाक्य रचना और उपयोग के संदर्भ में। वाक्यविन्यास लगभग भाषाओं के बीच समान है। यहाँ और वहां कुछ quirks (सबसे विशेष रूप से बाधाओं में)। लेकिन मूल रूप से यदि आप एक पढ़ सकते हैं, तो आप संभवतः दूसरे को पढ़/उपयोग कर सकते हैं।
कार्यान्वयन में हालांकि सबसे बड़ा अंतर है।
जावा प्रकार विलोपन की धारणा जेनरिक लागू करने के लिए उपयोग करता है। संक्षेप में अंतर्निहित संकलित कक्षा वास्तव में सामान्य नहीं हैं। वे ऑब्जेक्ट और कास्ट करने के लिए संकलित करते हैं।असल में जावा जेनरिक एक संकलित समय आर्टिफैक्ट हैं और आसानी से रनटाइम पर विचलित हो सकते हैं।
सी # दूसरी ओर, सीएलआर के आधार पर, जेनिक्स को बाइट कोड पर सभी तरह से लागू करें। 2.0 में जेनिक्स का समर्थन करने के लिए सीएलआर ने कई तोड़ने वाले बदलाव किए। लाभ प्रदर्शन सुधार, गहरे प्रकार के सुरक्षा सत्यापन और प्रतिबिंब हैं।
फिर प्रदान की link मैं
मैंने आपके स्ट्रेलोक के लिंक, एंडर्स हेजल्सबर्ग के [साक्षात्कार] (http://www.artima.com/intv/generics2.html), और एरिक लिपर्ट के [ब्लॉग-पोस्ट] (http://blogs.msdn.com) को पढ़ लिया है /b/ericlippert/archive/2009/07/30/generics-are-not-templates.aspx)। लेकिन मुझे अभी भी यह नहीं मिल रहा है - सी # कैसे टाइप एरर ** और ** संदर्भ प्रकार समान आईएल कोड साझा नहीं करता है? क्या आप इस पर विस्तार कर सकते हैं? –
@AlexanderMalakhov सभी संदर्भ प्रकार असेंबली में एक शब्द आकार हैं और एक ही निर्देश के साथ छेड़छाड़ की जा सकती है, इसलिए वे एक ही असेंबली पैटर्न साझा कर सकते हैं। आप उन्हें कहां अलग होने की उम्मीद करेंगे? – JaredPar
मुझे लगता है कि जावा बिल्कुल वही काम करता है। फिर, कहां जानकारी है? उदाहरण के लिए, प्रतिबिंब कैसे काम कर सकता है? –
अंतर माइक्रोसॉफ्ट और सूर्य द्वारा एक डिजाइन निर्णय करने के लिए नीचे आता है
Generics in Java संकलक द्वारा type erasure के माध्यम से लागू किया गया है, जिसका अर्थ है कि प्रकार की जांच संकलन समय पर होती है, और प्रकार की जानकारी हटा दी जाती है।
जब एक सामान्य प्रकार instantiated है, संकलक एक तकनीक से उन प्रकार अनुवाद:
जावा ट्यूटोरियल से, Generics: Type Erasure: यह दृष्टिकोण नए कोड का उपयोग कर जेनरिक के साथ संगत विरासत कोड रखने के लिए लिया गया था कहा जाता है प्रकार विलोपन - एक प्रक्रिया है जहाँ संकलक मापदंडों टाइप करें और कक्षा या विधि के अंदर तर्क टाइप करने के लिए संबंधित सभी जानकारी निकाल देता है। प्रकार विलोपन जावा अनुप्रयोगों कि को जेनरिक का उपयोग जावा पुस्तकालयों और अनुप्रयोगों है कि जेनरिक पहले बनाए गए थे के साथ दोहरी संगतता बनाए रखने के लिए सक्षम बनाता है।
हालांकि, generics in C# (.NET) के साथ, वहाँ संकलक द्वारा कोई प्रकार विलोपन है, और प्रकार की जाँच करता रनटाइम के दौरान प्रदर्शन कर रहे हैं। इसका लाभ यह है कि टाइप की गई जानकारी संकलित कोड में संरक्षित है।
विकिपीडिया से:
इस डिजाइन पसंद करने का लाभ उठाया जाता है इस तरह के सामान्य प्रकार के संरक्षण के साथ प्रतिबिंब की इजाजत दी है, साथ ही सीमाओं विलोपन की में से कुछ को समाप्त करने के रूप में के रूप में अतिरिक्त कार्यक्षमता, प्रदान करते हैं (जैसे कि जेनेरिक सरणी बनाने में असमर्थ होने के नाते)। यह का भी अर्थ है कि रनटाइम कास्ट से प्रदर्शन हिट और सामान्य रूप से महंगा मुक्केबाजी रूपांतरण नहीं है।
"जेनेट जेनेरिक से बेहतर .NET जेनेरिक बेहतर है" कहने के बजाय, किसी को जेनेरिक को लागू करने के दृष्टिकोण में अंतर को देखना चाहिए। जावा में, ऐसा प्रतीत होता है कि अनुकूलता को संरक्षित करना एक उच्च प्राथमिकता थी, जबकि .NET (जब संस्करण 2.0 में पेश किया गया था) में, जेनिक्स का उपयोग करने का पूरा लाभ महसूस करना उच्च प्राथमिकता थी।
@ टॉम "विश्लेषण से प्रतिरक्षा" का क्या अर्थ है? – LamonteCristo
इसका मतलब है कि, हाँ, आप कह सकते हैं ".NET जेनेरिक जावा जेनरिक से बेहतर हैं"। जावा को दृष्टिकोण को तोड़ना चाहिए था और जब ऐसा करने का मौका था तो जेनेरिक तरीके से वापस सही तरीके से कार्यान्वित किया जाना चाहिए था। – Mike
"पिछड़ा संगतता" गलत है, वे दोनों पिछड़े संगत हैं। यह "माइग्रेशन संगतता" के लिए किया गया था। – kervin
इसके अलावा एंडर्स हेल्स्बर्ग वह भी दिलचस्प हो सकता है के साथ this बातचीत पाया पढ़ने के लिए प्रोत्साहित गहराई टूटने में एक बहुत अधिक है। जावा जेनरिक मौजूदा JVM कि कार्यान्वयन बनाम कुछ अजीब बातें करने के लिए नेतृत्व के साथ अधिकतम अनुकूलता के लिए किए गए थे आप सी # में देखें::
प्रकार विलोपन बलों कार्यान्वयन का प्रतिनिधित्व करने के लिए कि एंडर्स हेल्स्बर्ग कुछ अतिरिक्त नोट्स के साथ किए गए अंक संक्षेप में प्रस्तुत करना प्रत्येक जेनेरिक parametrized मूल्य
Object
के रूप में। संकलकObject
और अधिक विशिष्ट प्रकार के बीच स्वचालित डाले प्रदान करता है, यह प्रदर्शन पर प्रकार डाले के नकारात्मक प्रभाव और मुक्केबाजी को नहीं निकालता है (जैसेObject
विशिष्ट प्रकारMyClass
याint
को डाला जाता हैInteger
में बॉक्सिंग किया जा सकता था, जो हो सकता है सी #/.NET के लिए और भी गंभीर है अगर वे उपयोगकर्ता द्वारा परिभाषित मूल्य प्रकारों के कारण टाइप एरर दृष्टिकोण का पालन करते हैं)। के रूप में एंडर्स ने कहा: "आप निष्पादन क्षमता के किसी भी नहीं मिलता है" (कि reified जेनरिक सी # में सक्षम)प्रकार विलोपन संकलन समय क्रम दौरान सुलभ नहीं पर जानकारी उपलब्ध कराता है। कुछ ऐसा जो
List<Integer>
होता था, केवलList
बन जाता है जिसमें रनटाइम पर सामान्य प्रकार पैरामीटर पुनर्प्राप्त करने का कोई तरीका नहीं होता है। जावा जेनरिक के आसपास प्रतिबिंब या गतिशील कोड-जनरेशन परिदृश्य बनाना मुश्किल बनाता है। अधिक हालिया SO answer अज्ञात कक्षाओं के माध्यम से इसके आसपास एक तरीका दिखाता है। लेकिन चाल के बिना, प्रतिबिंब है कि एक संग्रह उदाहरण से तत्वों हो जाता है और यह एक और संग्रह उदाहरण के लिए कहते हैं गतिशील रूप से उत्पन्न कोड के निष्पादन के दौरान कार्यावधि में असफल हो सकता है के माध्यम से कार्यावधि में कोड जनरेट की तरह कुछ: प्रतिबिंब में बनामList<Integer>
List<Double>
में बेमेल को पकड़ने के साथ मदद नहीं करता है इन परिस्थितियों में।
लेकिन जवाब जोनाथन प्रायर के blog post को जोड़ने के लिए +1।
- 1. जावा - विस्तार HashMap - वस्तु बनाम जेनरिक व्यवहार
- 2. जावा जेनरिक टी वस्तु
- 3. जावा जेनरिक
- 4. जावा जेनरिक
- 5. जावा जेनरिक
- 6. जावा जेनरिक
- 7. जावा जेनरिक: कैप्चर ऑब्जेक्ट
- 8. खाली जावा जेनरिक
- 9. जावा जेनरिक + बिल्डर पैटर्न
- 10. जावा जेनरिक सहप्रसरण
- 11. जावा जेनरिक - विधि
- 12. जावा जेनरिक संकलन त्रुटि
- 13. जावा जेनरिक और जेएनआई
- 14. जावा जेनरिक: थ्रोबल
- 15. जावा जेनरिक - नक्शा
- 16. जावा जेनरिक और विरासत
- 17. जावा जेनरिक कंपाइलर त्रुटि
- 18. जावा जेनरिक और संख्या
- 19. जावा जेनरिक - बेस टाइप
- 20. जैक्सन जेएसओएन + जावा जेनरिक
- 21. जावा जेनरिक प्रकार पैरामीटर
- 22. जावा जेनरिक प्रश्न - कक्षा <T> बनाम टी?
- 23. सी/सी ++ बनाम जावा/सी #
- 24. सी # जेनरिक फ़ंक्शन
- 25. सी # जेनरिक UserControl
- 26. जावा बनाम सी संदर्भ
- 27. जावा बनाम सी
- 28. सी # बनाम जावा
- 29. जावा जेनरिक, ई से ई
- 30. जावा जेनरिक और रिटर्न प्रकार
ऐसा लगता है कि इस प्रश्न से पहले ही पूछा जा चुका है - http://stackoverflow.com/questions/31693/differences-in-generics#31866 – serg10
व्यापक तुलना [यहां] (http://www.jprl.com/Blog/ संग्रह/विकास/2007/अगस्त -31.html), कुछ लिंक के साथ। – Strelok