2012-04-06 17 views
6

Estoy tratando de convertir el mapa de los parámetros de un ServletRequest a un mapa Scala de Scala 2.9.0.1:¿Cómo se convierte una java.util.Collections.unmodifiableMap en un mapa inamovible de Scala?

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

He importado collection.JavaConversions._, y en tiempo de ejecución presente se lanza:

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

Respuesta

8

¿Qué tal si llama al .toMap en él?

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

Sin poner toMap, JavaConversions sólo le permite convertir implícitamente a un mutable Scala mapa:

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

Presumiblemente, esto es debido a que una de Java Map es mutable, por lo que sólo deben estar representados en Scala como mutable.Map hasta que lo convierta explícitamente en immutable.Map.

Tenga en cuenta que cuando se acaba de decir Map en Scala, que realmente está hablando collection.immutable.Map desde Predef alias Map de esa manera:

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

Así, cuando decimos request.getParameterMap.asInstanceOf[Map[String, Array[String]]], que están realmente preguntando Scala para convertir implícitamente una aplicación Java Map en el collection.immutable.Map de Scala, que no quiere hacer ya que el Map de Java es mutable.

Cuestiones relacionadas