关于地图:使用Scala 2.10进行枚举和映射

Enumeration and mapping with Scala 2.10

我正在尝试将我的应用程序移植到Scala 2.10.0-M2。 我看到了一些不错的改进,编译器发出了更好的警告。 但是我也遇到了很多错误,所有错误都与Enumeration.values的映射有关。

我举一个简单的例子。 我想进行枚举,然后预先创建一堆对象,并构建一个使用枚举值作为键,然后将一些匹配的对象用作值的地图。 例如:

1
2
3
4
5
6
7
8
9
10
11
object Phrase extends Enumeration {
  type Phrase = Value
  val PHRASE1 = Value("My phrase 1")
  val PHRASE2 = Value("My phrase 2")
}

class Entity(text:String)

object Test {
    val myMapWithPhrases = Phrase.values.map(p => (p -> new Entity(p.toString))).toMap  
}

现在,这在Scala 2.8和2.9上可以正常工作。 但是2.10.0-M2给我以下警告:

1
2
3
4
[ERROR] common/Test.scala:21: error: diverging implicit expansion for type scala.collection.generic.CanBuildFrom[common.Phrase.ValueSet,(common.Phrase.Value, common.Entity),That]
[INFO] starting with method newCanBuildFrom in object SortedSet
[INFO]   val myMapWithPhrases = Phrase.values.map(p => (p -> new Entity(p.toString))).toMap
                                                 ^

是什么原因造成的,以及如何解决?


这基本上是类型不匹配的错误。 您可以通过首先将is转换为列表来解决:

1
2
scala> Phrase.values.toList.map(p => (p, new Entity(p.toString))).toMap
res15: scala.collection.immutable.Map[Phrase.Value,Entity] = Map(My phrase 1 -> Entity@d0e999, My phrase 2 -> Entity@1987acd)

有关更多信息,请参见"发散的隐式扩展" scalac消息的含义是什么? 和什么是发散的隐式扩展错误?


从错误中可以看出,保存枚举的ValueSet在某些时候变成了SortedSet。 它想在地图上产生SortedSet,但不能在您的Entity上进行排序。

这样的情况适用于案例类Entity:

1
2
3
implicit object orderingOfEntity extends Ordering[Entity] {
  def compare(e1: Entity, e2: Entity) = e1.text compare e2.text
}