2011-08-19 12 views
8

Nadal jestem początkującym programistą Scala, więc przepraszam, jeśli to pytanie może wyglądać naiwnie, ale szukałem przez chwilę i nie znalazłem żadnych rozwiązań. Używam Scala 2.8, i mam PXGivenZ klasa zdefiniowana jako:Problem niedopasowania typu scala (oczekiwana mapa, znaleziona scala.collection.mutable.HashMap)

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

Kiedy próbuję instancji element tej klasy do innego bloku programu jak ten:

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

otrzymuję następujący błąd:

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

jest wyraźnie coś, czego nie rozumiem: jak jest mapa [SEK [Int], mapa [Int, Double]] różni się od HashMap [SEK [Int], HashMap [Int ,Podwójnie]]? Czy coś jest nie tak z klasami "zmiennymi"?

Z góry dziękuję wszystkim, którzy mi pomogą!

Odpowiedz

20

Domyślnie Map zaimportowany do pliku scala to scala.collection.immutable.Map, a nie scala.collection.Map. I oczywiście w twoim przypadku HashMap jest zmienną mapą, a nie niezmienną.

Tak więc, jeśli chcesz że Map dotyczy scala.collection.Map w pliku, trzeba je importować jawnie:

import scala.collection.Map 

Powodem tego wyboru jest to, że nie będzie manipulować niezmienna i jest zmienny struktury w ta sama droga. Dlatego scala domyślnie zakłada, że ​​użyjesz niezmiennej struktury, która jest "najbezpieczniejsza". Jeśli nie chcesz tego robić, musisz to wyraźnie zmienić.

+0

Dzięki! To rozwiązało problem :-) – Alberto

+0

'HashMap' może być zmienny lub niezmienny. Zmienna wersja musi zostać zaimportowana. –