2012-02-28 2 views
4

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

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

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 
               ^

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

+0

Я не получаю это с фрагменте кода выше. Является ли эта часть более крупного файла и существуют ли там другие определения, импорт? –

+0

Нет, это просто искусственный пример, самый короткий способ вызвать ошибку компиляции. Как правило, вместо «объекта теста» с использованием карты было бы большее приложение. – vertti

+1

Я думаю, что это ошибка ... ну, не совсем ошибка, но, конечно, непреднамеренное следствие. Я бы открыл билет об этом. –

ответ

4

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

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

Для получения дополнительной информации см ответов на What's a “diverging implicit expansion” scalac message mean? и What is a diverging implicit expansion error?

+3

В чем проблема с кодом? – soc

+1

Спасибо за обходной путь. Было бы неплохо, если бы кто-то мог объяснить причину его необходимости. – vertti

1

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

Нечто подобное работает случай класса Entity:

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

', но не может сортировать по вашей Entity.' Почему нет? –

+0

@KevinMeredith the CanBuildFrom на карте требует заказа: http://www.scala-lang.org/api/2.12.0-RC2/scala/collection/SortedSet$.html#newCanBuildFrom[A]%28implicitord:Ordering[A ]% 29: scala.collection.generic.CanBuildFrom [scala.collection.SortedSet.Coll, A, scala.collection.SortedSet [A]] –

+0

Также https://groups.google.com/forum/#!topic/scala -internals/8RWkccSRBxQ [1-25] –

Смежные вопросы