2012-08-11 19 views
6

Mentre scrivevo un codice Scala, ho ricevuto uno strano messaggio di errore durante il tentativo di compilare il codice. Ho scomposto il codice in modo molto più semplice (il che non ha alcun senso da un punto di vista semantico, ma mostra comunque l'errore).Errore strano durante la compilazione di un ciclo for

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) { 
         ^

Quando si aggiunge una riga in più alla fine del ciclo for, il codice funziona:

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)) 

immagino, che ha qualcosa a che fare con il valore di ritorno della partita-caso-statement . Ma non sono abbastanza esperto di Scala per capire il motivo di questo messaggio di errore e cosa sto facendo male. Spero che qualcuno più saggio possa aiutare qui.

Qual è la ragione del messaggio di errore? Cosa c'è di sbagliato nella dichiarazione del caso della partita?

UPDATE: Testato con Scala 2.9.2

+0

questo è probabilmente un bug. Con 2.10 funziona perfettamente. – sschaef

risposta

6

Stai vedendo this bug in azione. E 'fissato in 2.10, e non c'è una soluzione semplice in this answer -Basta aggiungere un tipo di annotazione da qualche parte:

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

Grazie mille per segnalarlo. –

Problemi correlati