【问题标题】:scala: classcast exception: java.util.HashMap cannot be cast to scala.collection.immutable.Mapscala:类转换异常:java.util.HashMap 不能转换为 scala.collection.immutable.Map
【发布时间】:2015-10-04 07:21:32
【问题描述】:

我在下面给出了一个 scala 代码 sn-p:

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

注意:我不认为这个问题是通用类转换异常的重复,如下所述:请修改您的判断。

【问题讨论】:

  • 您的代码无法编译(Traversable 的参数太多)。请编辑您的帖子并更正它。另外,知道你把.asScala放在哪里会很有用。
  • 试试看this
  • 混合使用 Java 和 Scala 集合有什么特殊原因吗?如果你的程序只是 Scala,那么不要使用 Java 集合。
  • 是的,因为输入是从 java api 获得的
  • 你可以试试input.flatMap(_._2.asScala).groupBy(_._1).mapValues(_.map(_._2.toSet).reduce(_ ++ _)) 吗?为此,您需要同时导入 JavaConversions._JavaConverters._

标签: java scala classcastexception


【解决方案1】:

您的外部地图中有多个 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))

【讨论】:

  • 嗨,Sasche,我收到编译错误:value asScala 不是 Traversable 的成员
  • 我不太确定最外面的可遍历,只是尝试省略第一个'asScala'
  • @AmmSokun 我编辑了我的答案,将最外层的Traversable 视为 scala 集合
  • 还是不编译,去掉最外面的asScala后,下一个报错,编译失败
  • @AmmSokun 我错过了关于可变和不可变Set 以及所需转换器的导入的一些混淆。我编辑了一个版本的答案,至少在我的机器上可以编译。
猜你喜欢
  • 2012-08-07
  • 2021-12-14
  • 2023-03-29
  • 2018-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多