2012-11-01 9 views
18

यह कोड स्कैला 2.9.2 में एक प्रकार की मेल नहीं खाता है?विकल्प getOrElse टाइप मिस्चैच त्रुटि

scala> implicit def StringToOption(s:String) = Option(s) 
StringToOption: (s: String)Option[String] 

scala> "a".getOrElse("") 
res0: String = a 

scala> var opt:Option[String] = "a".getOrElse("") 
<console>:8: error: type mismatch; 
found : java.io.Serializable 
required: Option[String] 
     var opt:Option[String] = "a".getOrElse("") 
              ^

यह ठीक है:

scala> implicit def StringToOption(s:String): Option[String] = Option(s) 
StringToOption: (s: String)Option[String] 

scala> var b:Option[String] = "a".getOrElse("") toString 
b: Option[String] = Some(a) 
+0

> sschaef मेरी अंग्रेजी को ठीक करने के लिए धन्यवाद! – sndyuk

उत्तर

29

यह अधूरा पेड़ ट्रेवर्सल की एक अवांछित मामला है मुझे लगता है कि getOrElse रिटर्न String टाइप, लेकिन वास्तव में यह java.io.Serializable रिटर्न की उम्मीद है। getOrElse का हस्ताक्षर प्रकार चौड़ा करने की अनुमति देता है, इसलिए जब यह महसूस होता है कि StringOption[String] नहीं है तो यह पहले getOrElse, यानी Serializable पर एक अलग प्रकार के शिल्प को भरने का प्रयास करता है। लेकिन अब इसमें "a".getOrElse[Serializable]("") है और यह अटक गया है - मुझे एहसास नहीं है, मुझे लगता है कि यह समस्या इम्प्लिकेट की जांच करने से पहले सामान्य प्रकार को सामान्य बना रही थी।

एक बार जब आप समस्या का एहसास है, वहाँ एक ठीक है:

"a".getOrElse[String]("") 

अब टाइपकर्ता चलो-चौड़ा नीचे भटकना नहीं है पथ, आंतरिक पाता है।