2011-08-19 6 views
8

Sigo siendo un programador de Scala novato, lo siento si esta pregunta puede parecer ingenua, pero busqué por un tiempo y no encontré soluciones. Estoy usando Scala 2.8, y tengo un PXGivenZ clase define como:Problema de falta de coincidencia de Scala (esperado Mapa, encontrado scala.collection.mutable.HashMap)

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

Cuando intento crear una instancia de un elemento de esa clase en otro bloque de programa como este:

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

tengo la siguiente error:

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

es evidente que hay algo que no entiendo: ¿Cómo es un mapa [Sec [Int], mapa [Int, doble]] diferente de un HashMap [SEC [Int], HashMap [Int ,Doble]]? ¿O hay algún problema con las clases "mutables"?

Gracias de antemano a cualquier persona que me ayude!

Respuesta

20

De forma predeterminada, el Map que se importa en un archivo scala es scala.collection.immutable.Map y no scala.collection.Map. Y, por supuesto, en su caso, HashMap es un mapa mutable, no inmutable.

Así que si quieres que Map se refiere a scala.collection.Map en su archivo, que tienen que importar de forma explícita:

import scala.collection.Map 

La razón de esta elección es que no vas a manipular un inmutable y una estructura mutable en el mismo camino. Por lo tanto, scala infiere por defecto que usará una estructura inmutable que es "más segura". Si no desea hacerlo, debe cambiarlo explícitamente.

+0

Gracias! Eso resolvió el problema :-) – Alberto

+0

'HashMap' puede ser mutable o inmutable. La versión mutable debe haberse importado. –

Cuestiones relacionadas