Scala Java Deep Map Conversion (ConcurrentHashMap) - PullRequest
1 голос
/ 19 апреля 2011

У меня есть объект 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]

Я ценю ваш комментарий, как исправить эту ошибку.

1 Ответ

2 голосов
/ 19 апреля 2011

Неявные преобразования, такие как предоставляемые 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()

Итак, в конечном счете, я предсказываю много аннотаций типов в вашем будущем (приведенные выше определения, вероятно, будут работать с явным присваиванием типов, но я слишком сонный, чтобы все это печатать).

...