2012-08-11 31 views
6

को संकलित करते समय अजीब त्रुटि, जबकि मैं कुछ स्कैला कोड लिख रहा था, कोड को संकलित करने का प्रयास करते समय मुझे एक अजीब त्रुटि संदेश मिला। मैंने कोड को एक बहुत ही सरल तरीके से तोड़ दिया (जो किसी भी अर्थपूर्ण दृष्टिकोण से बिल्कुल समझ में नहीं आता है, लेकिन फिर भी त्रुटि दिखाता है)।लूप

scala> :paste 
// Entering paste mode (ctrl-D to finish) 

import scala.collection.mutable.ListBuffer 

val map = scala.collection.mutable.Map[Int, ListBuffer[Int]]() 
for (i <- 1 to 2) { 
    map.get(0) match { 
    case None => map += (1 -> ListBuffer[Int](1)) 
    case Some(l: ListBuffer[Int]) => l += i 
    } 
} 

// Exiting paste mode, now interpreting. 

<console>:12: error: type arguments [Any] do not conform to trait Cloneable's t 
pe parameter bounds [+A <: AnyRef] 
       for (i <- 1 to 2) { 
         ^

जब पाश के लिए के अंत में एक अतिरिक्त पंक्ति जोड़ने, कोड काम करता है:

scala> :paste 
// Entering paste mode (ctrl-D to finish) 

import scala.collection.mutable.ListBuffer 

val map = scala.collection.mutable.Map[Int, ListBuffer[Int]]() 
for (i <- 1 to 2) { 
    map.get(0) match { 
    case None => map += (1 -> ListBuffer[Int](1)) 
    case Some(l: ListBuffer[Int]) => l += i 
    } 
    1 // <- With this line it works 
} 

// Exiting paste mode, now interpreting. 

warning: there were 1 unchecked warnings; re-run with -unchecked for details 
import scala.collection.mutable.ListBuffer 
map: scala.collection.mutable.Map[Int,scala.collection.mutable.ListBuffer[Int]] 
= Map(1 -> ListBuffer(1)) 

मुझे लगता है, यह मैच केस-कथन की वापसी मान के साथ कुछ है । लेकिन मैं इस त्रुटि संदेश के पीछे कारण और मैं क्या गलत कर रहा हूं, इसका पता लगाने के लिए पर्याप्त स्कैला-विशेषज्ञ नहीं हूं। मुझे उम्मीद है कि कोई और बुद्धिमान यहां मदद कर सकता है।

त्रुटि संदेश के पीछे क्या कारण है? मैच-केस-स्टेटमेंट में क्या गलत है?

अद्यतन: स्काला 2.9.2 के साथ

+0

यह शायद एक बग है। 2.10 के साथ यह ठीक काम करता है। – sschaef

उत्तर

6

आप कार्रवाई में this bug देख रहे हैं परीक्षण किया गया। यह 2.10 में भी निश्चित होती है, और वहाँ this answer में एक आसान तरीके को, बस एक प्रकार एनोटेशन कहीं जोड़ते हैं:

for (i <- 1 to 2) { 
    map.get(0) match { 
    case None => map += (1 -> ListBuffer[Int](1)) 
    case Some(l: ListBuffer[Int]) => (l += i): Unit 
    } 
} 
+0

इसे इंगित करने के लिए बहुत बहुत धन्यवाद। –