2015-12-25 25 views
7

मैं एक प्रोग्रामिंग भाषा को स्थिर रूप से टाइप किए जाने के लाभ को समझने की कोशिश कर रहा हूं, और इसके माध्यम से, मुझे आश्चर्य है कि हमें घोषणा में प्रकार शामिल करने की आवश्यकता क्यों है? क्या यह स्पष्ट प्रकार बनाने के बजाय किसी भी उद्देश्य की सेवा करता है? यदि यह मामला है, तो मुझे बिंदु नहीं दिख रहा है। मैं समझता हूं कि स्थैतिक टाइपिंग संकलन-समय पर टाइपिंग की जांच करने की अनुमति देती है, लेकिन अगर हम स्पष्ट प्रकार की घोषणा छोड़ देते हैं, तो जावा अभी भी संकलन-समय के दौरान अनुमानित प्रकार नहीं कर सकता है?एक स्थिर टाइप की गई भाषा में महत्वपूर्ण प्रकार की घोषणा क्यों है?

myClass test = new myClass(); 

यहाँ प्रकार घोषणा अनावश्यक नहीं है:

उदाहरण के लिए, मान लीजिए कि हम जावा में डालते हैं? अगर मैं गलत नहीं हूँ, यह स्थिर बंधन है, और जावा पता होना चाहिए test भी संकलन समय पर प्रकार की स्पष्ट घोषणा के बिना प्रकार myClass की है।

संभव डुप्लिकेट करने के लिए उत्तर: यह स्थिर बनाम गतिशील प्रकार के बारे में एक सवाल के रूप में स्वीकार जवाब में विस्तार से बताया नहीं है, बल्कि के बारे में स्थिर टाइप किया भाषाओं में प्रकार निष्कर्ष,।

+3

क्या हुआ अगर आप 'वर्ग बी A' फैली हुई है, और' एक एक = नई बी() '? कंपाइलर को 'ए' के प्रकार का अनुमान कैसे लगाया जाना चाहिए? – gefei

+0

@femtoRgon यह प्रश्न गतिशील रूप से टाइप की गई भाषाओं के बारे में, स्थिर रूप से टाइप की गई भाषाओं में प्रकार अनुमान के बारे में है। – yshavit

+0

क्षमा करें, * गतिशील रूप से टाइप की गई भाषाओं के बारे में नहीं। :) – yshavit

उत्तर

11

सांख्यिकीय रूप से टाइप की गई भाषाएं हैं जो आपको प्रकार की घोषणा को छोड़ने की अनुमति देती हैं। इसे type inference कहा जाता है। कमियां यह है कि यह (भाषा डिजाइनरों के लिए) डिजाइन करने के लिए मुश्किल है कर रहे हैं (संकलक लेखकों के लिए) को लागू करने के मुश्किल है, और मुश्किल हो सकता है समझने के लिए जब कुछ गलत हो जाता (प्रोग्रामर के लिए)। अक्सर एक गुप्त संदेश के माध्यम से - उन लोगों में से पिछले एक के साथ समस्या यह है कि अगर कई (या सभी) अपने प्रकार के द्वारा बताए गए हैं, संकलक वास्तव में आप ज्यादा से ज्यादा "प्रकार सभी संगत नहीं हैं" नहीं बता सकता है।

एक आप का हवाला देते हैं जैसे एक छोटी सी मामले में, हाँ, यह आसान है। लेकिन जैसे ही आप मामूली मामले से आगे निकलते हैं, प्रणाली जटिलता में तेजी से बढ़ती है।

जावा वास्तव में सीमित रूप में, प्रकार निष्कर्ष का एक सा क्या करता है। उदाहरण के लिए, इस स्निपेट में के लिए:

List<String> emptyStrings = Collections.emptyList(); 

... संकलक अनुमान लगाया गया है कि विधि कॉल emptyList रिटर्न एक List<String>, और न सिर्फ एक List<T> प्रकार T अनिर्दिष्ट है जहां। उस रेखा के गैर अनुमानित संस्करण (जो भी वैध जावा है):

List<String> emptyStrings = Collections.<String> emptyList(); 
+1

यह वही है जो मैं सोच रहा था, धन्यवाद !! तो अब मेरे पास एक और समान प्रश्न है: घोषित प्रकार जावा जैसी भाषा में एक अलग मात्रा में स्मृति आवंटित करता है? 'ए ए' बनाम 'बी बी; ', यदि' ए 'में 100 इंस्टेंस वेरिएबल्स हैं और बी 0 है, तो मान लें, क्या यह घोषणा के दौरान कोई फर्क पड़ता है, या यह केवल तत्कालता में आता है? Primitives के बारे में कैसे? – rb612

+2

@ आरबी 612 इससे कोई फर्क नहीं पड़ता; स्मृति पूरी तरह से वस्तु द्वारा निर्धारित किया जाता है, इसके संदर्भ में नहीं। संदर्भ सिर्फ एक निश्चित आकार है, इसलिए तीन संदर्भ 'स्ट्रिंग ए',' सूची बी' और 'ऐरेलिस्ट <हैश मैप <स्ट्रिंग, स्ट्रिंग >> सी' सभी एक ही स्थान ले लेंगे (और वास्तव में, जेवीएम जीता यह भी नहीं पता कि वे "कुछ वस्तु के संदर्भ" के अलावा कुछ भी हैं)। Primitives में polymorphism बिल्कुल नहीं है, लेकिन उनके पास अलग-अलग आकार होते हैं (एक बाइट केवल एक बाइट है, एक छोटा दो बाइट इत्यादि है)। – yshavit

+0

यह बहुत अच्छा है, धन्यवाद! तो संक्षेप में, जावा जैसी स्थिर टाइप की गई भाषा में प्रकार की स्पष्ट घोषणा केवल प्रकार की अनुमान से बचने के लिए होती है और स्मृति आवंटन से कोई लेना देना नहीं है? – rb612

1

यह आवश्यक है। आप विरासत प्राप्त कर सकते हैं, जहां प्रकार आवश्यक हैं।

उदाहरण के लिए:

Building build1 = new House(); 
Building build2 = new SkyScraper(); 

यह बहुरूपता में एक ही है।

फिर आप उदाहरण के लिए सरणी के लिए सभी Building रों एकत्र कर सकते हैं। यदि एक House और एक SkyScraper होगा तो आप ऐसा नहीं कर सकते हैं।

+0

ठीक है, मैं इसे देख सकता हूँ। लेकिन सिर्फ एक घर होगा यदि आप build1 चाहता था, 'हाउस build1 = नए सदन() की तरह,' नहीं, आप पहली बार हाउस छोड़ने के लिए सक्षम होना चाहिए और सिर्फ लिखने 'build1 = नए सदन();'? – rb612

+0

उत्तर संपादित @ rb612 – maskacovnik

+0

धन्यवाद।मुझे लगता है कि मेरे प्रश्न को सही नहीं कहा गया था, और टाइप अनुमान के साथ और अधिक करना था, जो कि @ यशवत द्वारा उत्तर में समझाया गया है। – rb612

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