用这个简单的代码
import scala.collection.JavaConversions._
new java.util.concurrent.ConcurrentHashMap[String,String] ().toMap.put("abc","def")
Scala 抛出 java.lang.UnsupportedOperationException。
为什么?
最佳答案
这就是发生的事情(我认为):
- 您使用
new java.util.concurrent.ConcurrentHashMap[String,String]()
创建并发 java HashMap
- 然后使用
toMap
将其转换为不可变的 Scala Map
- 由于
toMap
未在java.util.concurrent.ConcurrentHashMap
上定义,因此应用了到 可变 scala 映射的隐式转换。然后toMap
将这个 mutableMap
变成一个 immutableMap
。 - 然后调用未在
scala.collection.immutable.Map
上定义的“put(...)”。 - 然而,scala 编译器方便地在您的 import
import scala 中找到从
定义了一个scala.collection.immutable.Map
到java.util.Map
的转换。 collection.JavaConversions._put(...)
方法。但是,转换会返回一个扩展AbstractMap
的包装器。 - 但是在那个包装器中没有实现
put(...)
方法。因此,调用以java.util.AbstractMap
的默认实现结束,它并没有真正实现put(...)
而是抛出一个UnsupportedOperationException
我想由此造成的困惑是现在大多数 scala 开发人员更喜欢 import scala.collection.JavaConverters._
而不是 import scala.collection.JavaConversions._
的原因之一.
所以,我认为,这可能是您想要做的:
import scala.collection.JavaConverters._
new java.util.concurrent.ConcurrentHashMap[String,String]().asScala.put("abc","def")
关于java - Scala Map 和 ConcurrentHashMap 抛出 java.lang.UnsupportedOperationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38568607/