यह एक बहुत अच्छा सवाल है! सबसे पहले, मैं आपको आश्वस्त करता हूं कि आप रिटर्न प्रकार को सुरक्षित रूप से निर्दिष्ट कर सकते हैं।
अब, आइए इसे देखें ... हां, जब अनुमान लगाने के लिए छोड़ा गया, स्कैला String
के बजाय java.lang.String
का अनुमान लगाता है। इसलिए, यदि आप ScalaDoc में "स्ट्रिंग" देखते हैं, तो आपको कुछ भी नहीं मिलेगा, जो यह इंगित करता है कि यह स्कैला वर्ग नहीं है। खैर, इसे किसी जगह से आना है, यद्यपि।
चलो देखते हैं कि डिफ़ॉल्ट रूप से स्कैला आयात क्या करता है। आप आरईपीएल पर खुद के द्वारा इसे पा सकते हैं:
संकुल
scala> :imports
1) import java.lang._ (155 types, 160 terms)
2) import scala._ (801 types, 809 terms)
3) import scala.Predef._ (16 types, 167 terms, 96 are implicit)
पहले दो हैं - और, वास्तव में, String
java.lang
पर पाया जा सकता! क्या यह है, तो? आइए उस पैकेज से कुछ और तत्काल जांच कर जांचें:
scala> val s: StringBuffer = new StringBuffer
s: java.lang.StringBuffer =
scala> val s: String = new String
s: String = ""
तो, ऐसा प्रतीत नहीं होता है। अब, यह scala
पैकेज के अंदर नहीं हो सकता है, या स्कैलाडोक पर देखकर यह पाया गया होगा। तो चलो scala.Predef
के अंदर देखो, और वहां है!
type String = String
इसका मतलब है कि String
एक उर्फ java.lang.String
के लिए (जो पहले से आयात किया गया था) है। यही कारण है कि एक चक्रीय संदर्भ की तरह लग रहा है, हालांकि, लेकिन अगर आप source जाँच, तो आप देखेंगे यह पूरा पथ के साथ परिभाषित किया गया है:
type String = java.lang.String
इसके बाद, आप क्यों पूछने के लिए चाहते हो सकता है? ठीक है, मुझे कोई विचार नहीं है, लेकिन मुझे संदेह है कि यह एक महत्वपूर्ण वर्ग को जेवीएम पर थोड़ा कम निर्भर करना है।
यह एक विषमता है कि स्ट्रिंग अक्षर का प्रकार java.lang.String के रूप में अनुमानित है, जब ऐसा लगता है कि वे समान रूप से स्ट्रिंग प्रकार के रूप में अनुमानित रूप से अनुमानित हो सकते हैं। लेकिन यह जानकर अच्छा लगा कि वे बिल्कुल वही बात हैं। –
@ लुइगी ऐसा इसलिए है क्योंकि शब्द java.lang.String के शब्द _are_। वास्तव में यहां कोई अनुमान नहीं है - वे शब्द हैं। –
शायद सबसे स्पष्ट, सर्वोत्तम, अच्छी तरह से इच्छित उत्तर मैंने कभी SO पर देखा है। तो ताज़ा करना धन्यवाद डैनियल – jbnunn