7

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

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
4

1 回答 1

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()

这大概是因为 JavaMap是可变的,所以它应该只在 Scala 中表示为 a mutable.Map,直到您将它显式转换为immutable.Map.

请注意,当您只是Map在 Scala 中说时,您实际上是在谈论collection.immutable.Map因为Predef别名Map是这样的:

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

因此,当您说 时request.getParameterMap.asInstanceOf[Map[String, Array[String]]],您实际上是在要求 Scala 将 Java 隐式转换Map为 Scala ,因为 Java是可变的collection.immutable.Map,所以它不想这样做。Map

于 2012-04-06T17:31:54.423 回答