Перечисление и отображение с помощью Scala 2.10 - PullRequest
4 голосов
/ 28 февраля 2012

Я пытаюсь перенести свое приложение на Scala 2.10.0-M2.Я вижу некоторые хорошие улучшения с лучшими предупреждениями от компилятора.Но я также получил кучу ошибок, связанных с отображением из Enumeration.values.

. Я приведу простой пример.Я хотел бы иметь перечисление, а затем предварительно создать группу объектов и построить карту, которая использует значения перечисления в качестве ключей, а затем некоторые соответствующие объекты в качестве значений.Например:

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 дает мне следующее предупреждение:

[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
                                                 ^

Что вызывает это и как вы это исправляет?

Ответы [ 2 ]

4 голосов
/ 29 февраля 2012

Это в основном ошибка несоответствия типов.Вы можете обойти его, сначала преобразовав его в список:

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)

Для получения дополнительной информации см. Ответы на Что означает скалярное сообщение «расходящееся неявное расширение»? и Что такое расходящаяся неявная ошибка расширения?

1 голос
/ 07 июня 2012

Как видно из вашей ошибки, ValueSet, который содержит перечисления, в какой-то момент стал SortedSet.Он хочет создать SortedSet на карте, но не может отсортировать вашу сущность.

Примерно так работает с классом дел Entity:

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