टीएल; डी सारांश: Nothing
प्रत्येक प्रकार का एक उप प्रकार है क्योंकि spec ऐसा कहता है। इसे भाषा के भीतर से समझाया नहीं जा सकता है। प्रत्येक भाषा (या कम से कम लगभग हर भाषा) में कुछ चीजें बहुत कोर पर होती हैं जिन्हें भाषा के भीतर से समझाया नहीं जा सकता है, उदा। java.lang.Object
में कोई सुपरक्लास नहीं है, भले ही प्रत्येक वर्ग में सुपरक्लास है, भले ही हम extends
क्लॉज नहीं लिखते हैं, इसलिए कक्षा पूरी तरह से सुपरक्लास प्राप्त करेगी।या "बूटस्ट्रैप विरोधाभास" रूबी, Object
में Class
का एक उदाहरण जा रहा है, लेकिन Class
Object
का एक उपवर्ग किया जा रहा है, और इस तरह Object
खुद का एक अप्रत्यक्ष उदाहरण जा रहा है (और भी अधिक सीधे: Class
Class
का एक उदाहरण है)।
मैं जानता हूँ कि स्काला कुछ भी नहीं नीचे प्रकार है। जब मैं एपीआई देखता हूं तो यह "किसी भी" से फैला हुआ है जो पदानुक्रम में शीर्ष है।
अब स्कैला एकाधिक विरासत का समर्थन नहीं करता है, इसलिए हम कैसे कह सकते हैं कि यह नीचे का प्रकार है।
इसके दो संभावित उत्तर हैं।
सरल और संक्षिप्त उत्तर है: because the spec says so। Spec का कहना है कि Nothing
सभी प्रकारों का एक उप प्रकार है, इसलिए Nothing
सभी प्रकार के उप प्रकार है। कैसे? हमें परवाह नहीं है। कल्पना कहती है कि ऐसा है, तो यही वह है। कंपाइलर डिज़ाइनर को इस कंपाइलर के भीतर इस तथ्य का प्रतिनिधित्व करने के बारे में चिंता करने दें। क्या आपको परवाह है कि कैसे Any
सुपरक्लस करने में सक्षम है? क्या आपको परवाह है कि संकलक में आंतरिक रूप से def
का प्रतिनिधित्व किया जाता है?
थोड़ा लंबा जवाब है: हाँ, यह सच है, Any
और केवल Any
से से Nothing
इनहेरिट करती है। परंतु! विरासत उप चीज के समान नहीं है। स्कैला में, विरासत और उप-प्रकार एक साथ निकटता से बंधे होते हैं, लेकिन वे एक ही चीज़ नहीं हैं। तथ्य यह है कि Nothing
केवल एक वर्ग से प्राप्त हो सकता है इसका मतलब यह नहीं है कि यह एक से अधिक प्रकार के उप-प्रकार नहीं हो सकता है। एक प्रकार एक वर्ग के समान नहीं है।
वास्तव में, बहुत विशिष्ट होने के लिए, spec यह भी नहीं कहता कि Nothing
सभी प्रकारों का एक उप प्रकार है। यह केवल इतना कहता है कि Nothing
conforms 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
के बीच सीधा संबंध है।Nothing
String
का उप प्रकार है क्योंकि Nothing
का सबटाइप प्रकार है, जिसमें String
शामिल हैं।
जैसा कि हम जानते हैं कि कुछ भी नीचे नहीं है लेकिन मुझे उपरोक्त उदाहरण में बताए गए स्ट्रिंग और कुछ भी के बीच संबंध देखने में कोई कठिनाई नहीं है।
String
और Nothing
के बीच संबंध है कि Nothing
String
की एक उप-प्रकार है। क्यूं कर? क्योंकि कल्पना इतनी कहती है।
संकलक जानता है 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
में।
'सभी प्रकार के टी' के लिए कुछ भी टी नहीं बढ़ाता है। इस प्रकार, 'स्ट्रिंग' –
कुछ भी नहीं बढ़ाता है, मुझे 100% यकीन नहीं है कि आपका प्रश्न क्या है, लेकिन संकलक 'कुछ भी नहीं जानता' और जानता है कि यह हर दूसरे प्रकार का उपप्रकार है क्योंकि यह संकलक में हार्डकोड किया गया है। मानक लाइब्रेरी में वास्तव में कोई फ़ाइल Nothing.scala नहीं है जो कहती है कि 'विशेषता कुछ भी स्ट्रिंग को इंट के साथ डबल के साथ बढ़ाती है ...'। –