我正在尝试将参数映射从ServletRequest转换为Scala 2.9.0.1中的Scala映射:
val params = request.getParameterMap.asInstanceOf[Map[String, Array[String]]]
Run Code Online (Sandbox Code Playgroud)
我已导入collection.JavaConversions._,并在运行时抛出:
java.lang.ClassCastException: java.util.Collections$UnmodifiableMap cannot be cast to scala.collection.immutable.Map
Run Code Online (Sandbox Code Playgroud)
怎么样只是呼唤.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()
Run Code Online (Sandbox Code Playgroud)
没有调用toMap,JavaConversions只允许您隐式转换为可变的 Scala映射:
scala> val z: collection.mutable.Map[Int,Int] = x
z: scala.collection.mutable.Map[Int,Int] = Map()
Run Code Online (Sandbox Code Playgroud)
大概这是因为Java Map是可变的,所以它应该只在Scala中表示为a,mutable.Map直到你明确地将它转换为immutable.Map.
请注意,当你刚刚说Map在Scala中,你是真的在谈论collection.immutable.Map,因为Predef别名Map这种方式:
scala> Map()
res0: scala.collection.immutable.Map[Nothing,Nothing] = Map()
Run Code Online (Sandbox Code Playgroud)
所以当你说request.getParameterMap.asInstanceOf[Map[String, Array[String]]],你真的要求Scala隐式地将Java Map转换为Scala collection.immutable.Map,因为Java Map是可变的,所以它不想做.
| 归档时间: |
|
| 查看次数: |
7806 次 |
| 最近记录: |