Проблема несоответствия типов в Scala (ожидаемая карта найдена scala.collection.mutable.HashMap) - PullRequest
14 голосов
/ 19 августа 2011

Я все еще начинающий программист Scala, поэтому извините, если этот вопрос может показаться наивным, но я некоторое время искал и не нашел решений.Я использую Scala 2.8, и у меня есть класс PXGivenZ, определенный как:

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

Когда я пытаюсь создать экземпляр элемента этого класса в другом блоке программы, например:

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

Я получаю следующую ошибку:

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

Я явно чего-то не понимаю: чем Map [Seq [Int], Map [Int, Double]] отличается от HashMap [Seq [Int], HashMap [Int, Double]]?Или что-то не так с "изменяемыми" классами?

Заранее спасибо всем, кто мне поможет!

1 Ответ

27 голосов
/ 19 августа 2011

По умолчанию Map, который импортируется в файл scala, равен scala.collection.immutable.Map, а не scala.collection.Map. И, конечно же, в вашем случае HashMap является изменяемой, а не неизменной картой.

Таким образом, если вы хотите, чтобы Map ссылался на scala.collection.Map в вашем файле, вы должны импортировать его явно:

import scala.collection.Map

Причина этого выбора в том, что вы не будете манипулировать неизменной и изменяемой структурой одинаково. Таким образом, по умолчанию Scala предполагает, что вы будете использовать неизменяемую структуру, которая является «наиболее безопасной». Если вы не хотите этого делать, вы должны изменить это явно.

...