无法将java ArrayList转换为scala不可变List

时间:2017-01-11 09:24:17

标签: scala

我有以下数据结构:

  

java.util.Map [List [String],List [String]] = {[10,20] = [1500],[5,7] = [1400]}

我正在尝试使用Scala提取数字10 20 5 and 7。我希望实现这一目标的方式是:

map.head._1 -> to extract 10 (map.head returns a tuple)
map.head._2 -> to extract 20 (map.head returns a tuple)

但是,我收到以下异常:

java.lang.ClassCastException: java.util.ArrayList cannot be cast to scala.collection.immutable.List

我已阅读有关导入import scala.collection.JavaConversions._但是,这并没有解决任何问题。

谢谢,非常感谢任何帮助!

试图实现此目的的代码是:

 def getTokenRangeForKeys(params: String): java.util.Map[List[String], List[String]] = {
    invokeOperation[java.util.Map[List[String], List[String]]]("XXX", "YYY", Array(params))
  }

上面的方法返回我的地图,如下所示:

  map = java.util.Map[List[String],List[String]] = {[10, 20]=[1500], [5, 7]=[1400]}

到目前为止我尝试过:

map.head._1 -> java.lang.ClassCastException: java.util.ArrayList cannot be cast to scala.collection.immutable.List

scalaMap = map.asScala
m.headOption match {
  case Some((h1, h2)) => println((h1, h2)) -> java.util.ArrayList cannot be cast to scala.collection.immutable.List
  case None => ...
}

2 个答案:

答案 0 :(得分:0)

请勿使用JavaConversions

import scala.collection.JavaConverters._
val m = map.asScala.map({case (h, k) => (h.asScala, k.asScala)})
m.headOption match {
  case Some((h1, h2)) => ...
  case None => ...
}

答案 1 :(得分:0)

我认为您对来自Java世界的内容的声明应该是:

java.util.Map[java.util.List[String], java.util.List[String]]

java.util.Map[List[String], List[String]]的当前形式中,您声明了Scala列表的Java地图,这可能不是您想要的。传递Java类型时JVM没有抱怨,因为只检查顶级类型作为函数签名检查的一部分 - 这称为类型擦除。

在此,您应该使用JavaConverters asScala转换为Reactormonk答案中所写的相应Scala类型:

import scala.collection.JavaConverters._
val m = map.asScala.map({case (h, k) => (h.asScala, k.asScala)})