2012-04-06 87 views
6

我想參數映射,從一個ServletRequest到斯卡拉地圖斯卡拉轉換2.9.0.1:如何將java.util.Collections.unmodifiableMap轉換爲不可變的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 

回答

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> val z: collection.mutable.Map[Int,Int] = x 
z: scala.collection.mutable.Map[Int,Int] = Map() 

據推測,這是因爲一個Java Map是可變的,所以應該只在斯卡拉表示作爲mutable.Map,直到您明確將其轉換爲immutable.Map

注意,當你剛剛說的斯卡拉Map,你是真的在談論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納入斯卡拉的collection.immutable.Map,它不想做,因爲Java的Map是可變的。

相關問題