2016-08-22 11 views
5

मुझे पता है स्कैला कुछ भी नीचे नहीं है। जब मैं एपीआई देखता हूं तो यह "किसी भी" से फैला हुआ है जो पदानुक्रम में शीर्ष है।स्कैला कुछ भी डेटाटाइप

अब स्कैला एकाधिक विरासत का समर्थन नहीं करता है, इसलिए हम कैसे कह सकते हैं कि यह नीचे का प्रकार है। दूसरे शब्दों में यह सीईसी, लिस्ट, स्ट्रिंग, इंट आदि जैसे सभी वर्गों या लक्षणों को सीधे विरासत में नहीं मिला है। यदि ऐसा है तो हम कैसे कह सकते हैं कि यह सभी प्रकार के नीचे है?

मेरा मतलब यह है कि यदि हम सूची [स्ट्रिंग] सूची में सूची [कुछ भी नहीं] (शून्य) असाइन करने में सक्षम हैं क्योंकि सूची स्केल में कॉन्वर्सेंट है, यह कैसे संभव है क्योंकि कुछ भी और स्ट्रिंग प्रकार के बीच कोई प्रत्यक्ष संबंध नहीं है। जैसा कि हम जानते हैं कि कुछ भी नीचे नहीं है लेकिन मुझे उपरोक्त उदाहरण में बताए गए स्ट्रिंग और कुछ भी के बीच संबंध देखने में कोई कठिनाई नहीं है।

धन्यवाद & सादर, मोहम्मद

+1

'सभी प्रकार के टी' के लिए कुछ भी टी नहीं बढ़ाता है। इस प्रकार, 'स्ट्रिंग' –

+2

कुछ भी नहीं बढ़ाता है, मुझे 100% यकीन नहीं है कि आपका प्रश्न क्या है, लेकिन संकलक 'कुछ भी नहीं जानता' और जानता है कि यह हर दूसरे प्रकार का उपप्रकार है क्योंकि यह संकलक में हार्डकोड किया गया है। मानक लाइब्रेरी में वास्तव में कोई फ़ाइल Nothing.scala नहीं है जो कहती है कि 'विशेषता कुछ भी स्ट्रिंग को इंट के साथ डबल के साथ बढ़ाती है ...'। –

उत्तर

3

अब के बाद से स्काला एकाधिक वंशानुक्रम का समर्थन नहीं करता

स्काला एकाधिक वंशानुक्रम का समर्थन है, विशेषता mixin का उपयोग कर करता है। यह वर्तमान में कम्यूटिव नहीं है, यानी A with BB with A (यह डॉटी के साथ होगा) के समान नहीं है, लेकिन फिर भी यह एकाधिक विरासत का एक रूप है, और वास्तव में स्कैला के मजबूत बिंदुओं में से एक है, क्योंकि यह हीरे की समस्या को इसके रैखिकरण नियमों के माध्यम से हल करता है ।

वैसे, Null जावा से विरासत में मिला एक और नीचे का प्रकार है (जिसे Nothing नीचे भी कहा जा सकता है क्योंकि आप किसी भी संभावित स्थान पर रनटाइम अपवाद फेंक सकते हैं)।

मुझे लगता है कि आपको कक्षा विरासत और प्रकार सीमाओं के बीच अंतर करने की आवश्यकता है। Nothing को नीचे के प्रकार के रूप में परिभाषित करने में कोई विरोधाभास नहीं है, हालांकि यह List जैसे किसी भी प्रकार से "स्पष्ट रूप से" उत्तराधिकारी नहीं है। यह एक क्षमता, अपवाद फेंकने की क्षमता की तरह है।

अगर हम कुछ भी नहीं है और स्ट्रिंग प्रकार के बीच कोई सीधा संबंध न होने के कारण सूची में [स्ट्रिंग] सूची के रूप में स्केला कैसे यह संभव है में covariant है की सूची [कुछ भी नहीं] (शून्य) आवंटित करने में सक्षम हैं

हां, नीचे के प्रकार का विचार यह है कि Nothing भी (कई अन्य चीजों के बीच) String का उप-प्रकार है। तो तुम

def foo: String = throw new Exception("No") 

यह केवल काम करता है लिख सकते हैं क्योंकि Nothing (एक अपवाद फेंकने के प्रकार) की घोषणा की वापसी प्रकार String की तुलना में अधिक विशिष्ट है।

2

टीएल; डी सारांश: Nothing प्रत्येक प्रकार का एक उप प्रकार है क्योंकि spec ऐसा कहता है। इसे भाषा के भीतर से समझाया नहीं जा सकता है। प्रत्येक भाषा (या कम से कम लगभग हर भाषा) में कुछ चीजें बहुत कोर पर होती हैं जिन्हें भाषा के भीतर से समझाया नहीं जा सकता है, उदा। java.lang.Object में कोई सुपरक्लास नहीं है, भले ही प्रत्येक वर्ग में सुपरक्लास है, भले ही हम extends क्लॉज नहीं लिखते हैं, इसलिए कक्षा पूरी तरह से सुपरक्लास प्राप्त करेगी।या "बूटस्ट्रैप विरोधाभास" रूबी, Object में Class का एक उदाहरण जा रहा है, लेकिन ClassObject का एक उपवर्ग किया जा रहा है, और इस तरह Object खुद का एक अप्रत्यक्ष उदाहरण जा रहा है (और भी अधिक सीधे: ClassClass का एक उदाहरण है)।


मैं जानता हूँ कि स्काला कुछ भी नहीं नीचे प्रकार है। जब मैं एपीआई देखता हूं तो यह "किसी भी" से फैला हुआ है जो पदानुक्रम में शीर्ष है।

अब स्कैला एकाधिक विरासत का समर्थन नहीं करता है, इसलिए हम कैसे कह सकते हैं कि यह नीचे का प्रकार है।

इसके दो संभावित उत्तर हैं।

सरल और संक्षिप्त उत्तर है: because the spec says so। Spec का कहना है कि Nothing सभी प्रकारों का एक उप प्रकार है, इसलिए Nothing सभी प्रकार के उप प्रकार है। कैसे? हमें परवाह नहीं है। कल्पना कहती है कि ऐसा है, तो यही वह है। कंपाइलर डिज़ाइनर को इस कंपाइलर के भीतर इस तथ्य का प्रतिनिधित्व करने के बारे में चिंता करने दें। क्या आपको परवाह है कि कैसे Any सुपरक्लस करने में सक्षम है? क्या आपको परवाह है कि संकलक में आंतरिक रूप से def का प्रतिनिधित्व किया जाता है?

थोड़ा लंबा जवाब है: हाँ, यह सच है, Any और केवल Any से से Nothing इनहेरिट करती है। परंतु! विरासत उप चीज के समान नहीं है। स्कैला में, विरासत और उप-प्रकार एक साथ निकटता से बंधे होते हैं, लेकिन वे एक ही चीज़ नहीं हैं। तथ्य यह है कि Nothing केवल एक वर्ग से प्राप्त हो सकता है इसका मतलब यह नहीं है कि यह एक से अधिक प्रकार के उप-प्रकार नहीं हो सकता है। एक प्रकार एक वर्ग के समान नहीं है।

वास्तव में, बहुत विशिष्ट होने के लिए, spec यह भी नहीं कहता कि Nothing सभी प्रकारों का एक उप प्रकार है। यह केवल इतना कहता है कि Nothingconforms to all types

दूसरे शब्दों में यह सीईसी, लिस्ट, स्ट्रिंग, इंट आदि जैसे सभी वर्गों या लक्षणों को सीधे विरासत में नहीं मिला है। यदि ऐसा है तो हम कैसे कह सकते हैं कि यह सभी प्रकार के नीचे है?

फिर, हम कह सकते हैं, क्योंकि कल्पना कहती है कि हम यह कह सकते हैं।

हम कैसे कह सकते हैं कि def किसी विधि को परिभाषित करता है? क्योंकि the spec says so। हम कैसे कह सकते हैं कि a b c का अर्थ है a.b(c) और a b_: c का मतलब { val __some_unforgeable_id__ = a; c.b_:(__some_unforgeable_id__) } जैसा ही है? क्योंकि the spec says so। हम कैसे कह सकते हैं कि "" एक स्ट्रिंग है और '' एक चरित्र है? क्योंकि the spec says so

मैं क्या मतलब है कि अगर हम [स्ट्रिंग] सूची के रूप में सूचीबद्ध करने के लिए सूची [कुछ भी नहीं] (शून्य) आवंटित करने में सक्षम हैं स्केला कैसे यह संभव है में covariant कुछ भी नहीं है और स्ट्रिंग प्रकार के बीच कोई सीधा संबंध न होने के कारण है ।

हाँ, वहाँ प्रकार Nothing और String के बीच सीधा संबंध है।NothingString का उप प्रकार है क्योंकि Nothingका सबटाइप प्रकार है, जिसमें String शामिल हैं।

जैसा कि हम जानते हैं कि कुछ भी नीचे नहीं है लेकिन मुझे उपरोक्त उदाहरण में बताए गए स्ट्रिंग और कुछ भी के बीच संबंध देखने में कोई कठिनाई नहीं है।

String और Nothing के बीच संबंध है कि NothingString की एक उप-प्रकार है। क्यूं कर? क्योंकि कल्पना इतनी कहती है।

संकलक जानता है Nothing उसी तरह यह 1 जानता Int का एक उदाहरण है और एक + विधि है, आप कहीं स्काला मानक पुस्तकालय के स्रोत कोड, the Int class is actually abstract and all its methods have no implementation पर देखने भले ही String की एक उप-प्रकार है।

Someone, somewhere wrote some code within the compiler that knows how to handle adding two numbers, भले ही उन संख्याओं को वास्तव में जेवीएम प्राइमेटिव के रूप में दर्शाया गया है और स्कैला ऑब्जेक्ट सिस्टम के अंदर भी मौजूद नहीं है। वैसे ही, someone, somewhere wrote some code within the compiler that knows that Nothing is a subtype of all types भले ही इस तथ्य का प्रतिनिधित्व नहीं किया गया है (और यह भी प्रतिनिधित्व योग्य नहीं है) the source code of Nothing में।

+0

मैंने कुछ समय में देखा है कि सबसे विनिर्देश गहन उत्तर में से एक :) –

+0

मैंने लगभग किसी परेशानी से "बार-बार" रवैया को दोबारा शुरू करने की कोशिश की, अक्सर बार-बार यह spec को इंगित करता है, क्योंकि मुझे लगता है कि यह "परवाह नहीं है" रवैया इस बात के दिल में है कि प्रोग्रामिंग क्या है: अमूर्तता और पुन: उपयोग। यदि कल्पना कहती है कि यह काम करता है, तो मुझे परवाह नहीं है कि यह कैसे काम करता है, मैं बस इसका उपयोग करता हूं। (दरअसल, यह सच नहीं है, मैं एक जिज्ञासु लड़का हूं और मुझे कंपाइलर्स और वीएम और सामान में गहराई से दिलचस्पी है, लेकिन मुझे लगता है कि यह उपयोग करने के लिए एक उपयोगी दृष्टिकोण है और यहां तक ​​कि अधिक महत्वपूर्ण रूप से अवशोषण डिजाइन करना।) –

+0

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

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