15 votes

Problème de non-concordance des types en Scala (attendu Map, trouvé scala.collection.mutable.HashMap)

Je suis encore un programmeur Scala débutant, alors désolé si cette question peut paraître naïve, mais j'ai cherché pendant un certain temps et je n'ai trouvé aucune solution. J'utilise Scala 2.8, et j'ai une classe PXGivenZ définie comme :

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

Lorsque j'essaie d'instancier un élément de cette classe dans un autre bloc de programme comme celui-ci :

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

Je reçois l'erreur suivante :

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

Il y a clairement quelque chose que je ne comprends pas : en quoi une Map[Seq[Int],Map[Int,Double]] est-elle différente d'une HashMap[Seq[Int], HashMap[Int,Double]] ? Ou y a-t-il un problème avec les classes "mutables" ?

Merci d'avance à tous ceux qui m'aideront !

30voto

Nicolas Points 11558

Par défaut, le Map qui est importé dans un fichier scala est scala.collection.immutable.Map et non scala.collection.Map . Et bien sûr, dans votre cas, HashMap est une carte mutable, pas une carte immuable.

Ainsi, si vous voulez que Map se réfère à scala.collection.Map dans votre fichier, vous devez l'importer explicitement :

import scala.collection.Map

La raison de ce choix est que vous ne manipulerez pas une structure immuable et une structure mutable de la même manière. Ainsi, scala déduit par défaut que vous utiliserez des structures immuables qui sont "les plus sûres". Si vous ne voulez pas le faire, vous devez le changer explicitement.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X