簡體   English   中英

Scala Map和ConcurrentHashMap拋出java.lang.UnsupportedOperationException

[英]Scala Map and ConcurrentHashMap throw a java.lang.UnsupportedOperationException

有了這個簡單的代碼

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]()創建並發java哈希映射
  2. 然后使用toMap將其轉換為不可變的scala Map
  3. 由於toMap未在java.util.concurrent.ConcurrentHashMap定義,因此將應用隱式轉換為可變 scala映射。 然后toMap使這個可變 Map成為一個不可變的 Map
  4. 然后調用未在scala.collection.immutable.Map定義的'put(...)'。
  5. 然而,scala編譯器方便地在導入import scala.collection.JavaConversions._ java.util.Map找到從scala.collection.immutable.Mapjava.util.Map的轉換,其中定義了put(...)方法。 但是,轉換返回一個擴展AbstractMap的包裝器。
  6. 但是在該包裝器中沒有實現put(...)方法。 因此,調用最終在java.util.AbstractMap的默認實現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中的默認集合是不可變的。 如果你看一看的API Map (發現這里 ),你會看到Map缺少的方法put 所以異常正確地告訴你, Map不能做你想做的事。 如果要使用值填充Map

Map("abc" -> "def")

順便說一句,不可變集合已經是線程安全的。 無需使用ConcurrentHashMap

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM