2010-01-29 18 views
16

सी ++ के टेम्पलेट्स के जावा समतुल्य क्या है?सी ++ के टेम्पलेट्स के जावा समतुल्य क्या है?

मुझे पता है कि टेम्पलेट नामक एक इंटरफ़ेस है। क्या यह संबंधित है?

+0

मैंने इसे और अधिक समझने योग्य बनाने के लिए अपने प्रश्न को फिर से लिखने का प्रयास किया। अगर आपको लगता है कि यह सवाल किसी और चीज में बदल गया है तो मेरे बदलावों को वापस लाने के लिए स्वतंत्र महसूस करें। – jalf

+1

@ आधा: अरे गलती से मैं वापस लुढ़का .. क्या आप इसे फिर से समझ सकते हैं? – giri

+0

@ गिरनी, मैंने इसे आपके लिए आधे बदलावों में वापस ले लिया – Trent

उत्तर

44

Templates C++ में जावा में मौजूद नहीं है। सबसे अच्छा अनुमान generics है।

एक बड़ा फर्क है कि C++ यह कानूनी है:

<typename T> T sum(T a, T b) { return a + b; } 

जावा में कोई समकक्ष निर्माण नहीं है। सबसे अच्छा है कि आप कह सकते हैं

<T extends Something> T Sum(T a, T b) { return a.add(b); } 

जहां Something एक विधि add जिन्हें कहा जाता है।

सी ++ में, क्या होता है कि संकलक कोड में उपयोग किए गए टेम्पलेट के सभी उदाहरणों के लिए टेम्पलेट का एक संकलित संस्करण बनाता है। इस प्रकार अगर हम

int intResult = sum(5, 4); 
double doubleResult = sum(5.0, 4.0); 

है तो सी ++ संकलक int के लिए sum का एक संस्करण और double के लिए sum का एक संस्करण संकलित कर देगा।

जावा में, erasure की अवधारणा है। क्या होता है कि संकलक जेनेरिक प्रकार पैरामीटर के सभी संदर्भों को हटा देता है। कंपाइलर कोड के केवल एक संकलित संस्करण बनाता है इस पर ध्यान दिए बिना कि यह विभिन्न प्रकार के पैरामीटर के साथ कितनी बार उपयोग किया जाता है।

अन्य मतभेदों

  • सी ++ की अनुमति नहीं है, जबकि जावा प्रकार पैरामीटर का सीमांकन करता
  • सी ++ प्रकार पैरामीटर पुरातन होने के लिए, जबकि जावा नहीं है की अनुमति देता है
  • सी ++ की अनुमति देता है टेम्पलेट्स type parameters to have defaults जहां जावा
  • नहीं है
  • सी ++ template specialization की अनुमति देता है जबकि जावा नहीं है और, इस बिंदु से अपेक्षा की जानी चाहिए, सी जे + शैली template metaprogramming जावा जेनरिक के साथ असंभव है।
  • जावा
  • Policy-based design में curiously recurring template pattern देखने के बारे में भूल जाओ जावा
  • में
+0

आपका सी ++ उदाहरण संकलित करने में असफल हो जाएगा यदि आप इसे एक प्रकार को पारित करने का प्रयास करते हैं जिसमें अतिरिक्त परिभाषा नहीं है। विधि जोड़ें के साथ, अपने जावा उदाहरण के समान। आपका उदाहरण टेम्पलेट मतभेदों को चित्रित नहीं करता है, लेकिन जावा में ऑपरेटर ओवरलोडिंग की कमी है। अन्यथा, अच्छा जवाब :) – gnud

+5

@gnud: यह सही है, लेकिन एक सूक्ष्म अंतर है। सी ++ में जिस टेम्पलेट को मैंने ऊपर लिखा है वह 'टी' पर प्रतिबंध के बिना कानूनी है; यह केवल तभी होता है जब आप इसे उस प्रकार से उपयोग करने का प्रयास करते हैं जिसमें परिभाषित नहीं किया गया है, तो विफलता होगी। जावा में, कोई समकक्ष नहीं है। तो सी ++ में आप "+' 'के किसी भी चीज़ के लिए 'sum' परिभाषित कर सकते हैं। जावा में आप यह नहीं कह सकते हैं; आप केवल निर्दिष्ट कर सकते हैं कि 'टी'' कुछ 'बढ़ाता है जिसमें' add' विधि है। इस प्रकार यदि आपके पास 'यू' है जो 'कुछ' का विस्तार नहीं करता है लेकिन इसमें' add' विधि है, तो आप उपरोक्त परिभाषित 'sum' का उपयोग' U' के उदाहरणों पर नहीं कर सकते हैं। – jason

+2

सी ++ प्रकार पैरामीटर की बाध्यता की अनुमति देता है, लेकिन वास्तव में चौराहे के रास्ते में। असल में यदि किसी कारण से टेम्पलेट विस्तार विफल रहता है तो इसे उम्मीदवार विस्तार की सूची से हटा दिया जाता है। इसे C++ समुदाय में SFINAE (प्रतिस्थापन विफलता कोई त्रुटि नहीं है) कहा जाता है। आप कक्षाओं पर संकलन समय आत्मनिरीक्षण करने के लिए इसका उपयोग कर सकते हैं और कुछ चीजों को एक तरह से और दूसरी चीजों का विस्तार कर सकते हैं। – Omnifarious

0

जावा जेनरिक जो समान है, लेकिन टेम्पलेट्स के रूप में बिल्कुल वैसा ही नहीं हैं असंभव है। मुझे नहीं पता कि टेम्पलेट इंटरफ़ेस क्या है लेकिन इसका C++ टेम्पलेट्स से कोई लेना देना नहीं है।

5

जावा में कोई वास्तविक टेम्पलेट्स नहीं हैं। सी ++ टेम्पलेट्स संकलित-समय इकाइयां हैं जिनका उपयोग कक्षाएं उत्पन्न करने के लिए किया जाता है। रनटाइम पर, उनमें से कोई निशान नहीं है।

जावा में, जेनेरिक नामक तंत्र के हिस्से के रूप में पैरामीटर प्रकार हैं। यह एक समान उद्देश्य प्रदान करता है, लेकिन यह कैसे काम करता है और इसके प्रभावों में काफी अलग है।रनटाइम पर इसका कुछ प्रतिनिधित्व है, विशिष्ट नियम हैं, आदि

Java tutorial पढ़कर प्रारंभ करें, फिर यदि आप "पावर उपयोगकर्ता" बनना चाहते हैं तो गुफाओं के विस्तृत विवरण के लिए ब्लॉच का प्रभावी जावा पढ़ें।

+0

पहला पैराग्राफ शायद मैंने देखा टेम्पलेट्स का सबसे संक्षिप्त स्पष्टीकरण है। अकेले इसके लिए +1। :) – jalf

0

जावा में टेम्पलेट तंत्र में कोई निर्माण नहीं है। स्थिर में वे जेनेरिक हैं। इसके अलावा, ides में कुछ कोड टेम्पलेट्स कहा जाता है उदा। eclipse के लिए।

0

आपको जावा में वास्तव में टेम्पलेट की आवश्यकता नहीं है। टेम्पलेट्स मुख्य रूप से उपयोगी होते हैं जब आपको पैरामीटर के रूप में पूरी तरह से अलग प्रकार की आवश्यकता होती है जिसे आप कुछ नहीं जानते हैं। जावा में, सभी ऑब्जेक्ट आभासी होते हैं और एक रूट ऑब्जेक्ट से प्राप्त होते हैं, और आदिम प्रकारों को अधिक स्पष्ट रूप से परिभाषित किया जाता है और अधिक संवेदनात्मक तरीके से काम करता है इसलिए वास्तव में इसका कोई मतलब नहीं है।

आप सी ++ शैली टेम्पलेट्स के साथ बेहतर प्रदर्शन प्राप्त कर सकते हैं, लेकिन जिस तरह से वे अधिक कोड उत्पन्न करते हैं और तेज़ CPU गति हर साल डेटा एक्सेस गति को अधिक से अधिक निकाल देती है, यह मामला कम और कम होता है, खासकर जब यह आता है primitives के विरोध के रूप में वस्तुओं के लिए।

+0

@charles लिखा "... वे अधिक कोड उत्पन्न करते हैं ..."। यह एक अति-सामान्यीकरण है। किसी भी तरह की भाषा सुविधा का दुरुपयोग किया जा सकता है। यदि आप जानते हैं कि आप क्या कर रहे हैं तो आपको कोड ब्लोट के साथ समस्या नहीं होगी। इसके अलावा, संकलित सी ++ कोड जावा में आवश्यक मेटा डेटा की मात्रा से अधिक नहीं है जो "अधिक गतिशील" होने के लिए आवश्यक है। लेकिन मैं आपकी पहली वाक्य से सहमत हूं। आप रनटाइम पॉलीमोर्फिज्म + कचरा संग्रह का उपयोग कर बहुत दूर हो सकते हैं। प्रदर्शन सिर्फ थोड़ा चूसना होगा। – sellibitze

+0

अच्छी तरह से, एकमात्र समय वे अधिक कोड उत्पन्न नहीं करेंगे यदि आपके पास केवल एक प्रकार का टेम्पलेट द्वारा उपयोग किया गया है और केवल टेम्पलेट का उपयोग करके एक ऑब्जेक्ट फ़ाइल है। मेरा मतलब यह नहीं है कि कभी भी सी ++ प्रकार की ताकतों के बाद से टेम्पलेट का उपयोग न करें, लेकिन जावा पर उतना ही प्रदर्शन सुधार नहीं होगा क्योंकि ज्यादातर लोग सोचते हैं और बहुत जटिलता भी जोड़ते हैं। –

+0

यह फ़ील्ड और आपकी कोडिंग शैली पर निर्भर करता है, जब आपको कुछ प्रोग्रामों से निपटने की ज़रूरत होती है जो छवि प्रसंस्करण जैसे कई प्राचीन प्रकारों के साथ गड़बड़ कर लेते हैं + आपको "मज़ेदार" के एक लूप को इनलाइन करने की आवश्यकता होती है, टेम्पलेट जाने का एक तरीका है। छवि प्रसंस्करण के क्षेत्र में, हम हमेशा गति के साथ व्यापार करने के लिए और अधिक बाइनरी स्थान का उपयोग करते हैं।इसके अलावा, संकलित समय बहुरूपता निर्भरता को कम कर सकती है क्योंकि विरासत कक्षाओं के भीतर बहुत मजबूत संबंध लागू करती है, जब मुझे इसकी आवश्यकता नहीं होती है, तो मुझे इससे नफरत है, लेकिन जावा और अन्य की ओओ केवल भाषा मुझे ऐसा करने के लिए मजबूर करती है – StereoMatching

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