2015-10-04 2 views
-2

У меня есть фрагмент кода Scala приведен ниже:Scala: classcast исключение: java.util.HashMap не может быть приведен к scala.collection.immutable.Map

// country code to nameToPlaces traversable 
val input : Traversable[(Int, java.util.Map[String, java.util.Set[String]])] ... 
val nameToPlacesMap : Map[String, Set[String]] = input.toMap. 
      values. 
      map (x => x.toSeq). // throws a class cast exception 
      reduce((x,y) => x ++ y). 
      groupBy(_._1). 
      mapValues(_.map(_._2). 
      reduce((x,y)=>x.toSet ++ y.toSet)) 

nameToPlacesMap, как ожидается, собирать все nameToPlaces из всех стран , Однако при запуске этого кода я получаю ClassCastException

java.util.HashMap cannot be cast to scala.collection.immutable.Map 

Я попытался добавить asScala, но бесполезно. Я также импортирую import scala.collection.JavaConverters._ Любая помощь будет оценена.

ПРИМЕЧАНИЕ. Я не рассматриваю этот вопрос как дубликат общего исключения класса, как указано ниже: Пожалуйста, пересмотрите свое мнение.

+0

Ваш код не скомпилирован (слишком много аргументов для трассировки). Пожалуйста, отредактируйте свой пост и исправьте его. Кроме того, было бы полезно узнать, где вы помещаете '.asScala'. –

+0

Попробуйте взглянуть на [это] (http://stackoverflow.com/questions/3127238/convert-java-util-mapstring-object-to-scala-collection-immutable-mapstring) –

+0

Есть ли особая причина, по которой вы смешиваете Коллекции Java и Scala? Если ваша программа - это только Scala, тогда не используйте коллекции Java. – Jesper

ответ

0

У вас есть несколько коллекций java на вашей внешней карте, вы должны обязательно их преобразовать. Насколько я могу судить, для вас должно работать следующее:

import java.util 

import scala.collection.JavaConverters._ 
import scala.collection.mutable 

val input : Traversable[(Int, java.util.Map[String, java.util.Set[String]])] = 
    Seq((1, new util.HashMap[String, java.util.Set[String]]())) 

val nameToPlacesMap : Map[String, mutable.Set[String]] = input.toMap.mapValues(
    // convert inner Map 
    _.asScala.mapValues(
    // convert java.util.Set 
    mutable.Set.empty ++ _.asScala) 
).values. 
      map (x => x.toSeq). // hopefully not anymore :: throws a class cast exception 
      reduce((x,y) => x ++ y). 
    groupBy(_._1). 
    mapValues(_.map(_._2). 
    reduce((x,y)=> x ++ y)) 
+0

Привет, Sasche, я получаю ошибку компиляции: значение asScala не является членом Traversable –

+0

Я не был так уверен в самом внешнем обходе, просто попробуйте оставить первый «asScala» –

+0

@AmmSokun Я отредактировал свой ответ, чтобы обработать внешняя часть 'Traversable', как коллекция scala –

 Смежные вопросы

  • Нет связанных вопросов^_^