如何将java.util.Collections.unmodifiableMap转换为不可变的Scala Map?

Jef*_*ung 7 scala

我正在尝试将参数映射从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)

dhg*_*dhg 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()
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是可变的,所以它不想做.