2011-08-19 15 views
8

Sono ancora un principiante programmatore Scala, mi dispiace se questa domanda può sembrare ingenua, ma ho cercato un po 'e non ho trovato soluzioni. Sto usando Scala 2.8, e ho una PXGivenZ classe definita come:Problema di disallineamento tipo Scala (mappa prevista, trovato scala.collection.mutable.HashMap)

class PXGivenZ (val x:Int, val z:Seq[Int], val values: Map[Seq[Int], Map[Int, Double]]){...} 

Quando provo creare un'istanza di un elemento di quella classe in un altro blocco del programma come questo:

// x is an Int 
// z is a LinkedList of Int 
... 
var zMap = new HashMap[Seq[Int], HashMap[Int, Double]] 
... 
val pxgivenz = new PXGivenZ(x, z, zMap) 

ho la seguente errore:

found : scala.collection.mutable.HashMap[Seq[Int],scala.collection.mutable.HashMap[Int,Double]] 
required: Map[Seq[Int],Map[Int,Double]] 
      val pxgivenz = new PXGivenZ(x, z, zMap) 
              ^

C'è chiaramente qualcosa che non capisco: come è una mappa [Seq [Int], mappa [int, double]] diverso da un HashMap [Seq [Int], HashMap [Int ,Doppio]]? O c'è qualcosa di sbagliato nelle classi "mutabili"?

Grazie in anticipo a chiunque mi aiuti!

risposta

20

Per impostazione predefinita, lo Map importato in un file scala è scala.collection.immutable.Map e non scala.collection.Map. E naturalmente, nel tuo caso, HashMap è una mappa mutevole, non immutabile.

Quindi, se si desidera che Map si riferisce a scala.collection.Map nel file, è necessario importarlo esplicitamente:

import scala.collection.Map 

La ragione di questa scelta è che non sarà possibile manipolare un immutabile e una struttura mutabile nel stessa strada. Di conseguenza, lo scala infra di default che userete strutture immutabili che sono "più sicure". Se non vuoi farlo, devi cambiarlo esplicitamente.

+0

Grazie! Questo ha risolto il problema :-) – Alberto

+0

'HashMap' può essere mutevole o immutabile. La versione mutabile deve essere stata importata. –