2010-08-27 12 views
6
List(1,2) match { 
    case List(1,_) => println("1 in postion 1") 
    case _ => println("default") 
} 

संकलित/ठीक काम करता है। तो करस्कैला सूची मैच

List(1) match ... 
List(3,4,5) match ... 

नहीं बल्कि

List() match ... 

जो निम्न त्रुटि में परिणाम

found : Int(1) 
required : Nothing 
      case List(1,_) => println("1 in postion 1") 

क्यों सूची() सूची (1, _) मिलान करने का प्रयास करता है?

उत्तर

6

जब आप List() लिखने, प्रकार निष्कर्ष निकाला Nothing जो सब कुछ करने के लिए उप-प्रकार है,।

क्या हो रहा है कि स्काला जब आप असंभव मैचों की कोशिश में एक त्रुटि देता है। उदाहरण के लिए, "abc" match { case 1 => } एक समान त्रुटि का परिणाम देगा। इसी तरह, क्योंकि List(1, _) स्थिर कभी नहीं मैच के लिए List() निर्धारित किया जा सकता, स्काला एक त्रुटि देता है।

2

हो सकता है कि क्योंकि ...

scala> implicitly[List[Nothing] <:< List[Int]] 
res3: <:<[List[Nothing],List[Int]] = <function1> 

scala> implicitly[List[Int] <:< List[Nothing]] 
<console>:6: error: could not find implicit value for parameter e:<:<[List[Int],List[Nothing]] 
     implicitly[List[Int] <:< List[Nothing]] 
+4

इसका मतलब क्या है कि 'सूची [इंट]' 'सूची के लिए मजबूर किया हुआ है [कुछ भी नहीं]' लेकिन इसका उल्टा संभव नहीं है। – missingfaktor

12

List() टाइप List[Nothing] है। यह अपेक्षा के अनुसार काम करेंगे आप List[Int]() का उपयोग करते हैं।

(सामान्य में, प्रकार के रूप में प्रतिबंधात्मक वे संभवतः हो सकता है के रूप में कर रहे हैं;। क्योंकि आप इसे में कुछ भी नहीं के साथ एक सूची बनाई है, सबसे प्रतिबंधात्मक-संभव प्रकार Nothing आपकी इच्छानुसार Int के बजाय प्रयोग किया जाता है)

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