【问题标题】:Scala Java Deep Map Conversion (ConcurrentHashMap)Scala Java 深度映射转换 (ConcurrentHashMap)
【发布时间】:2011-08-08 08:11:29
【问题描述】:

我有一个 ConcurrentHashMap 对象定义如下:

import scala.collection.JavaConversions._
val storage: ConcurrentMap[String,ConcurrentMap[Int,ConcurrentMap[String,Double]]] =
new ConcurrentHashMap[String,ConcurrentHashMap[Int,ConcurrentHashMap[String,Double]]]

而 Scala (2.8.1) 在编译时抱怨以下错误:

found   : java.util.concurrent.ConcurrentHashMap[String,java.util.concurrent.ConcurrentHashMap[String,String]]
required: scala.collection.mutable.ConcurrentMap[String,scala.collection.mutable.ConcurrentMap[String,String]]

但是当我尝试以下代码时,它可以工作:

val storage: ConcurrentMap[String,Double] = new ConcurrentHashMap[String,Double]

感谢您对如何解决此错误的评论。

【问题讨论】:

    标签: scala scala-2.8 scala-collections


    【解决方案1】:

    隐式转换,例如 JavaConversions 提供的转换,在实例级别而不是类型级别工作。因此,虽然可以转换最外层的地图,但内层的地图不会。

    没有办法直接隐式转换嵌套大小写。而且,不幸的是,在以下示例中似乎没有正确选择最具体的隐式:

    scala> val storage = new ConcurrentHashMap[String,ConcurrentHashMap[Int,ConcurrentHashMap[String,Double]]]
    storage: java.util.concurrent.ConcurrentHashMap[String,java.util.concurrent.ConcurrentHashMap[Int,java.util.concurrent.ConcurrentHashMap[String,Double]]] = {}
    
    scala> import scala.collection.JavaConverters._
    
    scala> for ((i, m) <- storage.asScala; (j, m2) <- m.asScala; (k, l) <- m2.asScala) yield ((i, j) -> (k, l))
    res0: scala.collection.mutable.Map[(String, Int),(String, Double)] = Map()
    
    scala> import scala.collection.JavaConversions._
    
    scala> for ((i, m) <- storage; (j, m2) <- m; (k, l) <- m2) yield ((i, j) -> (k, l))                        
    res3: scala.collection.mutable.Map[(String, Int),(String, Double)] = Map()
    

    所以,归根结底,我预测你的未来会有很多类型注释(上面的 for 理解可能适用于显式类型归属,但我太困了,无法全部输入。)

    【讨论】:

      猜你喜欢
      • 2013-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-10
      • 2020-01-05
      • 2017-05-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多