2011-07-02 13 views
38

आरईपीएल में, मैं एक फ़ंक्शन परिभाषित करता हूं। वापसी प्रकार नोट करें।स्कैला स्ट्रिंग बनाम java.lang.String - टाइप अनुमान

scala> def next(i: List[String]) = i.map {"0" + _} ::: i.reverse.map {"1" + _} 
next: (i: List[String])List[java.lang.String] 

और अगर मैं स्ट्रिंग

scala> def next(i: List[String]): List[String] = i.map {"0" + _} ::: i.reverse.map {"1" + _} 
next: (i: List[String])List[String] 

के रूप में वापसी के प्रकार का उल्लेख क्यों क्या अंतर है? मैं रिटर्न प्रकार को सूची [एएन] के रूप में भी निर्दिष्ट कर सकता हूं, इसलिए मुझे लगता है कि स्ट्रिंग सिर्फ java.lang.String के लिए एक रैपर सुपरटेप है। क्या इसका कोई व्यावहारिक प्रभाव होगा या क्या मैं सुरक्षित रूप से वापसी प्रकार निर्दिष्ट नहीं कर सकता?

उत्तर

52

यह एक बहुत अच्छा सवाल है! सबसे पहले, मैं आपको आश्वस्त करता हूं कि आप रिटर्न प्रकार को सुरक्षित रूप से निर्दिष्ट कर सकते हैं।

अब, आइए इसे देखें ... हां, जब अनुमान लगाने के लिए छोड़ा गया, स्कैला 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) 

पहले दो हैं - और, वास्तव में, Stringjava.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 

इसके बाद, आप क्यों पूछने के लिए चाहते हो सकता है? ठीक है, मुझे कोई विचार नहीं है, लेकिन मुझे संदेह है कि यह एक महत्वपूर्ण वर्ग को जेवीएम पर थोड़ा कम निर्भर करना है।

+0

यह एक विषमता है कि स्ट्रिंग अक्षर का प्रकार java.lang.String के रूप में अनुमानित है, जब ऐसा लगता है कि वे समान रूप से स्ट्रिंग प्रकार के रूप में अनुमानित रूप से अनुमानित हो सकते हैं। लेकिन यह जानकर अच्छा लगा कि वे बिल्कुल वही बात हैं। –

+0

@ लुइगी ऐसा इसलिए है क्योंकि शब्द java.lang.String के शब्द _are_। वास्तव में यहां कोई अनुमान नहीं है - वे शब्द हैं। –

+2

शायद सबसे स्पष्ट, सर्वोत्तम, अच्छी तरह से इच्छित उत्तर मैंने कभी SO पर देखा है। तो ताज़ा करना धन्यवाद डैनियल – jbnunn

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