如何将java.util.Collections.unmodifiableMap转换为不可变的Scala Map?

时间:2012-04-06 17:24:19

标签: scala

我正在尝试将参数映射从ServletRequest转换为Scala 2.9.0.1中的Scala映射:

val params = request.getParameterMap.asInstanceOf[Map[String, Array[String]]]

我导入了collection.JavaConversions._,并在运行时抛出:

java.lang.ClassCastException: java.util.Collections$UnmodifiableMap cannot be cast to scala.collection.immutable.Map

1 个答案:

答案 0 :(得分:8)

如何只是在其上调用.toMap

import collection.JavaConversions._
val x = java.util.Collections.unmodifiableMap[Int,Int](new java.util.HashMap[Int,Int]())
val y: Map[Int,Int] = x.toMap //y: Map[Int,Int] = Map()

不调用toMapJavaConversions只允许您隐式转换为可变 Scala地图:

scala> val z: collection.mutable.Map[Int,Int] = x
z: scala.collection.mutable.Map[Int,Int] = Map()

大概这是因为Java Map是可变的,因此它应该只在Scala中表示为mutable.Map,直到您明确地将其转换为immutable.Map

请注意,当你在Scala中说Map时,你真的在​​谈论collection.immutable.Map Predef别名Map那样:{/ p>

scala> Map()
res0: scala.collection.immutable.Map[Nothing,Nothing] = Map()

所以当你说request.getParameterMap.asInstanceOf[Map[String, Array[String]]]时,你真的要求Scala隐式地将Java Map转换为Scala的collection.immutable.Map,自Java Map以来它不想这样做是可变的。