java - Scala Map 和 ConcurrentHashMap 抛出 java.lang.UnsupportedOperationException

标签 java multithreading scala containers java.util.concurrent

用这个简单的代码

import scala.collection.JavaConversions._
new java.util.concurrent.ConcurrentHashMap[String,String]  ().toMap.put("abc","def")

Scala 抛出 java.lang.UnsupportedOperationException。

为什么?

最佳答案

这就是发生的事情(我认为):

  1. 您使用 new java.util.concurrent.ConcurrentHashMap[String,String]()
  2. 创建并发 java HashMap
  3. 然后使用 toMap
  4. 将其转换为不可变的 Scala Map
  5. 由于 toMap 未在 java.util.concurrent.ConcurrentHashMap 上定义,因此应用了到 可变 scala 映射的隐式转换。然后 toMap 将这个 mutable Map 变成一个 immutable Map
  6. 然后调用未在 scala.collection.immutable.Map 上定义的“put(...)”。
  7. 然而,scala 编译器方便地在您的 import import scala 中找到从 scala.collection.immutable.Mapjava.util.Map 的转换。 collection.JavaConversions._ 定义了一个 put(...) 方法。但是,转换会返回一个扩展 AbstractMap 的包装器。
  8. 但是在那个包装器中没有实现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/

相关文章:

java - 在部署到 PaaS (Cloud Foundry) 之前扫描 jar 文件

java - 复制和随机化列表中项目的位置

mongodb - 带有 reactivemongo 进程的 embedmongo 不退出

java - Groovy 语言有 ?.处理NullPointer异常的语法,scala中有类似的东西吗?

scala - 如何从 List[Any] 中提取所有 Int 值?

java - 对应用程序中未显示的源代码所做的更改 - 如何完全清除 tomcat 缓存

java - 按需填充下拉菜单 Java/Swing?

java - 如何从 Java 应用程序中的 Main 方法运行线程?

java - 如何使我的 ArrayList 线程安全? Java中解决问题的另一种方法?

java - Java 中是否有替代 Thread.sleep 的方法