2011-04-19 57 views
1

我定义为以下的ConcurrentHashMap对象:斯卡拉Java的深度地图转换(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] 

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

回答

2

隐式转换(例如由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() 

所以,归根结底,我在你的未来预测了很多类型的注解(在用于推导上面会可能与明确的类型归属一起工作,但是我太困了,不能全部输入。)