किसी भी, AnyVal, AnyRef, ऑब्जेक्ट के बीच के रिश्ते क्या हैं और जावा कोड में उपयोग किए जाने पर वे कैसे मैप करते हैं?


111

मैं आमतौर पर हर संयोजन की कोशिश करता हूं जब तक कि वह संकलित न हो जाए। क्या कोई समझा सकता है कि मुझे क्या उपयोग करना चाहिए?

जवाबों:


125

मैं एक संबंध में क्रिस के जवाब से असहमत हूँ । कक्षाएं 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 # का पालन करने की संभावना है, और शायद टाइपराइफ, के रूप में समानता का उपयोग किए बिना उन्हें अच्छे प्रदर्शन के साथ पूरा करना मुश्किल साबित हो रहा है।


2
एक अद्यतन: स्केल 2.9.2 के AnyValरूप में परिभाषित किया गया है sealed trait AnyVal extends Any। लेकिन स्काला 2.10 में यह बदल गया है abstract class AnyVal extends Any with NotNull, और अब AnyValनए मूल्य वर्गों की सुविधा के साथ इसका विस्तार करना संभव है , जैसे class MyValue(val u: Int) extends AnyVal:।
ebruchez

@ebruchez नोट के लिए धन्यवाद। मैंने नई क्षमताओं के अवलोकन के साथ अपना उत्तर अपडेट किया है।
डैनियल सी। सोबरल

कैसे कुछ नहीं है और नल इस से संबंधित है?
गौरव खरे


5

Anyऔर AnyVal, मेरा मानना ​​है कि, स्कैला प्रकार प्रणाली का हिस्सा है और इस तरह के वर्ग नहीं हैं (उसी तरह जो Nothingएक प्रकार है, एक वर्ग नहीं है)। आप उन्हें जावा कोड के भीतर से स्पष्ट रूप से उपयोग नहीं कर सकते।

Howwever, Java / Scala इंटरोपेशन में, जावा को स्वीकार करने वाली विधि से Objectscala Any/ की अपेक्षा होगी AnyRef

आप वास्तव में क्या करने का प्रयास कर रहे हैं?


मैं इस विषय को बेहतर ढंग से समझने की कोशिश कर रहा हूं ताकि मुझे पता चले कि मैं जावा कॉल स्काला या इसके विपरीत योजना बनाने के लिए किस प्रकार का उपयोग करूं। यह जवाब stackoverflow.com/questions/2334200/… और उसके कलाकारों AnyRefने मुझे याद दिलाया कि यह अभी भी मेरे लिए रहस्यमय था।
हुहुंजल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.