3

在“不耐烦的 Scala”中的章节和示例之后,有一个与将 JavaTreeMap用作 Scala相关的练习SortedMap。在 scala shell 中,我尝试了这个:

var t: scala.collection.SortedMap[String,Int] = new java.util.TreeMap[String,Int]()

但我收到有关类型不匹配的错误消息。有没有一种简单的方法可以做到这一点?

注意:我做了一个导入scala.collection.JavaConversions._然后做了这个:

var t: SortedMap[String,Int] = TreeMap[String,Int]()

这可行,但变量t的类型java.util.SortedMap是 ,而不是scala.collection.SortedMap

4

2 回答 2

2

我没看过那本书,但你需要下定决心。是tScalaSortedMap还是 Java TreeMap

ATreeMap不是 a SortedMap,因此您不能在不转换变量的情况下将其分配给SortedMap变量。JavaConversions将为您进行一些转换,包括:

implicit def mapAsScalaMap [A, B] (m: Map[A, B]): Map[A, B]
   Implicitly converts a Java Map to a Scala mutable Map.

但是,没有什么可以转换为SortedMap.

如果这种转换对您来说似乎很神秘,库设计者会同意,因此JavaConversions在 Scala 2.10 中已弃用,而支持JavaConverters,它需要特定的.asScala方法来进行转换。

不幸的是JavaConverters,没有任何东西可以产生一个SortedMap.asScala给你一个mutable.Map)。因此,您需要使用其元素重建集合。

import collection.JavaConverters._
import collection.SortedMap
var t: SortedMap[String, Int] =
    SortedMap[String, Int]() ++ new java.util.TreeMap[String,Int].asScala

在上面的代码中生成一个新的 TreeMap 显然有点毫无意义,因为它是空的,但是您应该了解如何处理现有的 TreeMap。如果您没有现有的,只需SortedMap在 Scala 中生成一个新的。

于 2012-08-28T01:55:48.193 回答
1
import collection._
import JavaConverters._

var t: scala.collection.SortedMap[String,Int] = 
    new java.util.TreeMap[String,Int]().asScala.map(identity)(breakOut)
于 2012-08-28T02:00:14.627 回答