जवाबों:
मैं एक संबंध में क्रिस के जवाब से असहमत हूँ । कक्षाएं Any
, AnyRef
और AnyVal
कर रहे हैं वर्गों। लेकिन वे JVM की आंतरिक सीमाओं के कारण, बायटेकोड में कक्षाओं के रूप में प्रकट नहीं होते हैं।
यह इस तथ्य से उत्पन्न होता है कि जावा में सब कुछ एक वस्तु नहीं है। वस्तुओं के अलावा, आदिम हैं। जावा में सभी ऑब्जेक्ट से वंशज हैं java.lang.Object
, लेकिन प्राइमेटिव अलग हैं और, वर्तमान में * , एक प्रोग्रामर द्वारा एक्स्टेंसिबल नहीं। यह भी ध्यान दें कि प्राथमिकताओं में "ऑपरेटर" होते हैं, विधियाँ नहीं।
स्काला में, दूसरे हाथ पर, सब कुछ है एक वस्तु, सभी वस्तुओं तरीकों के माध्यम से परस्पर एक वर्ग के हैं, और वे। जेवीएम बाइटकोड उत्पन्न करता है, यह प्रतिबिंबित नहीं करता है, लेकिन यह उन्हें किसी भी तरह से कम नहीं करता है, जैसा कि जावा में जेनरिक है, भले ही बायटेकोड उनके पास नहीं है।
तो, स्काला में, सभी ऑब्जेक्ट से वंशज हैं Any
, और इसमें दोनों शामिल हैं जो जावा वस्तुओं पर विचार करता है और जो जावा आदिम मानता है। जावा में कोई समान नहीं है क्योंकि ऐसा कोई एकीकरण नहीं है।
जावा में एक आदिम मानी जाने वाली हर चीज AnyVal
स्काला से उतरती है। स्केल 2.10.0 तक, AnyVal
सील कर दिया गया था, और प्रोग्रामर इसे विस्तारित करने में असमर्थ थे। यह देखना दिलचस्प होना चाहिए कि Scala के साथ .Net पर क्या होगा, क्योंकि अकेले में Scala के लिए इंटरऑपरेबिलिटी कम से कम उपयोगकर्ता द्वारा परिभाषित "प्राइमेटिव्स" को पहचानती है।
इसका विस्तार भी Any
है AnyRef
, जो java.lang.Object
(किसी भी दर पर जेवीएम पर) के बराबर है ।
स्काला 2.9.x तक, एक उपयोगकर्ता का विस्तार कर सकता है नहीं Any
या AnyVal
, और न ही उन्हें जावा से संदर्भ, लेकिन वहाँ थे अन्य उपयोगों वे स्काला में करने के लिए रखा जा सकता है। विशेष रूप से, हस्ताक्षर लिखें:
def f(x: AnyVal) = println(x)
def g(x: AnyRef) = println(x)
def h(x: Any) = println(x)
कक्षा पदानुक्रम से प्रत्येक साधन स्पष्ट होना चाहिए। हालांकि, ध्यान दें, वह है f
और h
ऑटो-बॉक्स, लेकिन g
नहीं होगा। यह कि जावा क्या करता है, इसके विपरीत है f
और इसमें h
निर्दिष्ट नहीं किया जा सकता है, और g
(साथ परिभाषित java.lang.Object
) ऑटो-बॉक्सिंग का कारण होगा।
Scala 2.10.0 के साथ शुरू, हालांकि, उपयोगकर्ता निम्नलिखित शब्दार्थों के साथ विस्तार AnyVal
या कर सकता है Any
:
यदि कोई वर्ग विस्तारित होता है AnyVal
, तो कुछ शर्तों के तहत ढेर पर इसके लिए कोई उदाहरण नहीं बनाया जाएगा। इसका मतलब है कि इस वर्ग के क्षेत्र (2.10.0 पर केवल एक ही फ़ील्ड की अनुमति है - चाहे वह परिवर्तन दिखाई दे रहा हो) स्टैक पर रहेगा, चाहे वे अन्य वस्तुएं हों या अन्य वस्तुओं के संदर्भ हों। यह तात्कालिक लागत के बिना विस्तार विधियों की अनुमति देता है।
यदि कोई लक्षण विस्तारित होता है Any
, तो इसका उपयोग दोनों वर्गों के साथ किया जा सकता है जो विस्तार करते हैं AnyRef
और कक्षाएं जो विस्तारित होती हैं AnyVal
।
पुनश्च: मेरे अपने विचार में, जावा को "संरचना" आदिमता की अनुमति देने में C # का पालन करने की संभावना है, और शायद टाइपराइफ, के रूप में समानता का उपयोग किए बिना उन्हें अच्छे प्रदर्शन के साथ पूरा करना मुश्किल साबित हो रहा है।
देखा है? पृष्ठ के पाठ में कुछ जावा इंटरऑपरेबिलिटी टिप्पणी है। http://www.scala-lang.org/node/128
Any
और AnyVal
, मेरा मानना है कि, स्कैला प्रकार प्रणाली का हिस्सा है और इस तरह के वर्ग नहीं हैं (उसी तरह जो Nothing
एक प्रकार है, एक वर्ग नहीं है)। आप उन्हें जावा कोड के भीतर से स्पष्ट रूप से उपयोग नहीं कर सकते।
Howwever, Java / Scala इंटरोपेशन में, जावा को स्वीकार करने वाली विधि से Object
scala Any
/ की अपेक्षा होगी AnyRef
।
आप वास्तव में क्या करने का प्रयास कर रहे हैं?
AnyRef
ने मुझे याद दिलाया कि यह अभी भी मेरे लिए रहस्यमय था।
AnyVal
रूप में परिभाषित किया गया हैsealed trait AnyVal extends Any
। लेकिन स्काला 2.10 में यह बदल गया हैabstract class AnyVal extends Any with NotNull
, और अबAnyVal
नए मूल्य वर्गों की सुविधा के साथ इसका विस्तार करना संभव है , जैसेclass MyValue(val u: Int) extends AnyVal
:।