2012-04-06 27 views
6

Sto cercando di convertire la mappa parametri da un ServletRequest a una mappa Scala di Scala 2.9.0.1:Come si converte una java.util.Collections.unmodifiableMap in una Scala Map immutabile?

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

ho importato collection.JavaConversions._, e in fase di esecuzione questo è gettato:

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

risposta

8

Che ne dici di chiamare lo .toMap su di esso?

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

Senza rimettere toMap, JavaConversions permette solo di convertire implicitamente ad una Scala mappa mutevole:

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

Presumibilmente questo è perché un Java Map è mutevole, quindi dovrebbe essere rappresentata solo in Scala come mutable.Map finché non lo si converte in modo esplicito in un immutable.Map.

Nota che quando hai appena detto Map a Scala, si sta davvero parlando collection.immutable.Map dal Predef alias Map in questo modo:

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

Quindi, quando si dice request.getParameterMap.asInstanceOf[Map[String, Array[String]]], siete veramente chiedendo Scala per convertire implicitamente un Java Map in Scala collection.immutable.Map, che non vuole fare dal momento che Java Map è modificabile.

Problemi correlati