2008-12-10 14 views
103

मैंने सुना है कि जेनरिक का जावा कार्यान्वयन सी # कार्यान्वयन के समान नहीं है। उसमें सिंटैक्स समान दिखता है, जावा कार्यान्वयन के बारे में क्या घटिया है, या यह एक धार्मिक दृष्टिकोण है?सी # बनाम जावा जेनरिक

+0

ऐसा लगता है कि इस प्रश्न से पहले ही पूछा जा चुका है - http://stackoverflow.com/questions/31693/differences-in-generics#31866 – serg10

+0

व्यापक तुलना [यहां] (http://www.jprl.com/Blog/ संग्रह/विकास/2007/अगस्त -31.html), कुछ लिंक के साथ। – Strelok

उत्तर

136

streloksi's link मतभेद टूट का एक बड़ा काम करता है। त्वरित और गंदी सारांश यह है ...

वाक्य रचना और उपयोग के संदर्भ में। वाक्यविन्यास लगभग भाषाओं के बीच समान है। यहाँ और वहां कुछ quirks (सबसे विशेष रूप से बाधाओं में)। लेकिन मूल रूप से यदि आप एक पढ़ सकते हैं, तो आप संभवतः दूसरे को पढ़/उपयोग कर सकते हैं।

कार्यान्वयन में हालांकि सबसे बड़ा अंतर है।

जावा प्रकार विलोपन की धारणा जेनरिक लागू करने के लिए उपयोग करता है। संक्षेप में अंतर्निहित संकलित कक्षा वास्तव में सामान्य नहीं हैं। वे ऑब्जेक्ट और कास्ट करने के लिए संकलित करते हैं।असल में जावा जेनरिक एक संकलित समय आर्टिफैक्ट हैं और आसानी से रनटाइम पर विचलित हो सकते हैं।

सी # दूसरी ओर, सीएलआर के आधार पर, जेनिक्स को बाइट कोड पर सभी तरह से लागू करें। 2.0 में जेनिक्स का समर्थन करने के लिए सीएलआर ने कई तोड़ने वाले बदलाव किए। लाभ प्रदर्शन सुधार, गहरे प्रकार के सुरक्षा सत्यापन और प्रतिबिंब हैं।

फिर प्रदान की link मैं

+1

मैंने आपके स्ट्रेलोक के लिंक, एंडर्स हेजल्सबर्ग के [साक्षात्कार] (http://www.artima.com/intv/generics2.html), और एरिक लिपर्ट के [ब्लॉग-पोस्ट] (http://blogs.msdn.com) को पढ़ लिया है /b/ericlippert/archive/2009/07/30/generics-are-not-templates.aspx)। लेकिन मुझे अभी भी यह नहीं मिल रहा है - सी # कैसे टाइप एरर ** और ** संदर्भ प्रकार समान आईएल कोड साझा नहीं करता है? क्या आप इस पर विस्तार कर सकते हैं? –

+0

@AlexanderMalakhov सभी संदर्भ प्रकार असेंबली में एक शब्द आकार हैं और एक ही निर्देश के साथ छेड़छाड़ की जा सकती है, इसलिए वे एक ही असेंबली पैटर्न साझा कर सकते हैं। आप उन्हें कहां अलग होने की उम्मीद करेंगे? – JaredPar

+0

मुझे लगता है कि जावा बिल्कुल वही काम करता है। फिर, कहां जानकारी है? उदाहरण के लिए, प्रतिबिंब कैसे काम कर सकता है? –

30

अंतर माइक्रोसॉफ्ट और सूर्य द्वारा एक डिजाइन निर्णय करने के लिए नीचे आता है

Generics in Java संकलक द्वारा type erasure के माध्यम से लागू किया गया है, जिसका अर्थ है कि प्रकार की जांच संकलन समय पर होती है, और प्रकार की जानकारी हटा दी जाती है।

जब एक सामान्य प्रकार instantiated है, संकलक एक तकनीक से उन प्रकार अनुवाद:

जावा ट्यूटोरियल से

, Generics: Type Erasure: यह दृष्टिकोण नए कोड का उपयोग कर जेनरिक के साथ संगत विरासत कोड रखने के लिए लिया गया था कहा जाता है प्रकार विलोपन - एक प्रक्रिया है जहाँ संकलक मापदंडों टाइप करें और कक्षा या विधि के अंदर तर्क टाइप करने के लिए संबंधित सभी जानकारी निकाल देता है। प्रकार विलोपन जावा अनुप्रयोगों कि को जेनरिक का उपयोग जावा पुस्तकालयों और अनुप्रयोगों है कि जेनरिक पहले बनाए गए थे के साथ दोहरी संगतता बनाए रखने के लिए सक्षम बनाता है।

हालांकि, generics in C# (.NET) के साथ, वहाँ संकलक द्वारा कोई प्रकार विलोपन है, और प्रकार की जाँच करता रनटाइम के दौरान प्रदर्शन कर रहे हैं। इसका लाभ यह है कि टाइप की गई जानकारी संकलित कोड में संरक्षित है।

विकिपीडिया से

:

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

"जेनेट जेनेरिक से बेहतर .NET जेनेरिक बेहतर है" कहने के बजाय, किसी को जेनेरिक को लागू करने के दृष्टिकोण में अंतर को देखना चाहिए। जावा में, ऐसा प्रतीत होता है कि अनुकूलता को संरक्षित करना एक उच्च प्राथमिकता थी, जबकि .NET (जब संस्करण 2.0 में पेश किया गया था) में, जेनिक्स का उपयोग करने का पूरा लाभ महसूस करना उच्च प्राथमिकता थी।

+0

@ टॉम "विश्लेषण से प्रतिरक्षा" का क्या अर्थ है? – LamonteCristo

+7

इसका मतलब है कि, हाँ, आप कह सकते हैं ".NET जेनेरिक जावा जेनरिक से बेहतर हैं"। जावा को दृष्टिकोण को तोड़ना चाहिए था और जब ऐसा करने का मौका था तो जेनेरिक तरीके से वापस सही तरीके से कार्यान्वित किया जाना चाहिए था। – Mike

+2

"पिछड़ा संगतता" गलत है, वे दोनों पिछड़े संगत हैं। यह "माइग्रेशन संगतता" के लिए किया गया था। – kervin

4

इसके अलावा एंडर्स हेल्स्बर्ग वह भी दिलचस्प हो सकता है के साथ this बातचीत पाया पढ़ने के लिए प्रोत्साहित गहराई टूटने में एक बहुत अधिक है। जावा जेनरिक मौजूदा JVM कि कार्यान्वयन बनाम कुछ अजीब बातें करने के लिए नेतृत्व के साथ अधिकतम अनुकूलता के लिए किए गए थे आप सी # में देखें::

  • प्रकार विलोपन बलों कार्यान्वयन का प्रतिनिधित्व करने के लिए कि एंडर्स हेल्स्बर्ग कुछ अतिरिक्त नोट्स के साथ किए गए अंक संक्षेप में प्रस्तुत करना प्रत्येक जेनेरिक parametrized मूल्य Object के रूप में। संकलक Object और अधिक विशिष्ट प्रकार के बीच स्वचालित डाले प्रदान करता है, यह प्रदर्शन पर प्रकार डाले के नकारात्मक प्रभाव और मुक्केबाजी को नहीं निकालता है (जैसे Object विशिष्ट प्रकार MyClass या int को डाला जाता है Integer में बॉक्सिंग किया जा सकता था, जो हो सकता है सी #/.NET के लिए और भी गंभीर है अगर वे उपयोगकर्ता द्वारा परिभाषित मूल्य प्रकारों के कारण टाइप एरर दृष्टिकोण का पालन करते हैं)। के रूप में एंडर्स ने कहा: "आप निष्पादन क्षमता के किसी भी नहीं मिलता है" (कि reified जेनरिक सी # में सक्षम)

  • प्रकार विलोपन संकलन समय क्रम दौरान सुलभ नहीं पर जानकारी उपलब्ध कराता है। कुछ ऐसा जो List<Integer> होता था, केवल List बन जाता है जिसमें रनटाइम पर सामान्य प्रकार पैरामीटर पुनर्प्राप्त करने का कोई तरीका नहीं होता है। जावा जेनरिक के आसपास प्रतिबिंब या गतिशील कोड-जनरेशन परिदृश्य बनाना मुश्किल बनाता है। अधिक हालिया SO answer अज्ञात कक्षाओं के माध्यम से इसके आसपास एक तरीका दिखाता है। लेकिन चाल के बिना, प्रतिबिंब है कि एक संग्रह उदाहरण से तत्वों हो जाता है और यह एक और संग्रह उदाहरण के लिए कहते हैं गतिशील रूप से उत्पन्न कोड के निष्पादन के दौरान कार्यावधि में असफल हो सकता है के माध्यम से कार्यावधि में कोड जनरेट की तरह कुछ: प्रतिबिंब में बनाम List<Integer>List<Double> में बेमेल को पकड़ने के साथ मदद नहीं करता है इन परिस्थितियों में।

लेकिन जवाब जोनाथन प्रायर के blog post को जोड़ने के लिए +1।

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