scala:classcast异常:java.util.HashMap无法强制转换为scala.collection.immutable.Map

时间:2015-10-04 07:21:32

标签: java scala classcastexception

我有一个scala代码段,如下所示:

// 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._ 任何帮助将不胜感激。

注意:我不认为这个问题是如下所述的通用转发例外的副本:请修改您的判断。

1 个答案:

答案 0 :(得分: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))