2012-09-05 9 views
22

जावा लैंड से आ रहा है मैं खुद को स्कैला सिखाने की कोशिश कर रहा हूं। हाल ही में मैं Int डेटा प्रकार के साथ काम कर रहा था और मैंने इंटेल क्लास के लिए एपीआई देखने का फैसला किया here"अंतिम अमूर्त वर्ग इंट प्राइवेट को समझने की कोशिश कर रहा है स्केल

क्या हैरान मुझे Int के लिए वर्ग परिभाषा है, जो abstract final है था।

मैं क्षमाप्रार्थी हूँ अगर मैं इस सवाल पूछने से पहले abstract और स्काला में final के अर्थ पर पढ़ा नहीं था, लेकिन मैं था उत्सुक, इसलिए मैंने तुरंत इस पोस्ट को टाइप किया।

तो मैं जो समझने की कोशिश कर रहा हूं वह है: abstract, final और extends स्कैला में अलग-अलग अर्थशास्त्र हैं? फिर, यह मेरी समझ में सबसे अच्छा है कि जावा में, एक ही समय में abstract और final नहीं हो सकता है। तो मैं final abstract class Int private extends AnyVal की व्याख्या कैसे करूं?

+1

द्वारा दिया जाता है नहीं, वे नहीं कर रहे हैं, कम से कम मूल रूप से (आप अभी भी सार का दृष्टांत नहीं कर सकते, तो आप के वारिस नहीं कर सकता/अंतिम ओवरराइड)। AFAIK, इस तरह से किया गया कारण यह है कि कुछ समय पहले इंट और अन्य AnyVal प्रकार केवल एक स्टब्स थे, फिर संकलन समय पर संकलक द्वारा फिर से लिखा गया। वे [इस प्रतिबद्धता] के बाद से नहीं हैं (https://github.com/scala/scala/commit/4253124eecba6bed38f1dc961c5c4ee39a29f730) –

+0

ओह, यह उपयोगी जानकारी है। मुझे इंगित करने के लिए धन्यवाद कि – ilango

उत्तर

28

के रूप में ओम-nom-nom टिप्पणी में बताया, abstract, इन्स्टेन्शियशन (new Int) मनाही जबकि final उपवर्गीकरण (new Int { ... }) रोकता है।

इसका कारण यह है कि scala.Int सीधे जावा वर्चुअल मशीन के आदिम पूर्णांक प्रकार द्वारा दर्शाया जाता है; अन्य समान प्रकार Byte, Short, Char, Long, Float, Double, Boolean हैं। क्योंकि वे रनटाइम पर आदिम प्रकार हैं (तथाकथित बॉक्स किए गए प्रकारों से बेहतर प्रदर्शन प्रदर्शित करते हैं) और JVM नए प्राइमेटिव जोड़ने की अनुमति नहीं देता है, ऐसे प्रकारों को बढ़ाने का कोई कानूनी तरीका नहीं होगा। इसके अलावा एक शाब्दिक (val i: Int = 33) देने के अलावा उन्हें तुरंत चालू करने का कोई तरीका नहीं है।

स्कैला के पास एक एकीकृत ऑब्जेक्ट सिस्टम बनाने के लिए इन प्रकार हैं जहां प्राचीन प्रकार और 'ऑब्जेक्ट्स' के बीच कोई तार्किक अंतर नहीं है। हालांकि शीर्ष पर एक पदानुक्रमित अंतर है जो AnyRef (java.lang.Object से संबंधित) और AnyVal (उन आदिम प्रकारों के अनुरूप है; और स्कैला के नए प्रकार Unit) को जोड़ना है। एकीकृत प्रकार सिस्टम पर

अधिक Tour of Scala: Unified Types

+0

बहुत सराहना की। – ilango

+0

मुझे यह ध्यान रखना होगा कि [स्वीकृत एसआईपी] भी है (http://docs.scala-lang.org/sips/pending/value-classes.html) जो गैर-डिफ़ॉल्ट व्यवहार वाले अनबॉक्स किए गए प्राइमेटिव्स का उपयोग मिटा देगा। –

+1

पीएस और हालांकि सभी जेवीएम प्राइमेटिव्स को 'AnyVal' के उपप्रकारों द्वारा दर्शाया जाता है, उलटा सच नहीं है ('यूनिट' पहले से ही उल्लेख किया गया था)। स्कैला 2.10 में, 'AnyVal' को विस्तारित करना संभव है, तथाकथित [मूल्य-वर्ग] (http://docs.scala-lang.org/sips/pending/value-classes.html) बनाना जो कि के लिए है कंपाइलर ऑप्टिमाइज़ेशन (जैसे इनलाइनिंग) से लाभान्वित, नई संख्यात्मक कक्षाओं का कार्यान्वयन। –

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

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