我正在尝试将参数映射从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
答案 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()
不调用toMap
,JavaConversions
只允许您隐式转换为可变 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
以来它不想这样做是可变的。