Я обнаружил некоторое загадочное поведение в Scala ValueSet. С таким перечислением
object MyEnum extends Enumeration{
val V1 = new MyEnum
val V2 = new MyEnum
class MyEnum extends Val
implicit def convertValue(v: Value): MyEnum = v.asInstanceOf[MyEnum]
}
Сопоставление MyEnum.values
из Value с MyEnum создает другой ValueSet, который при преобразовании в массив не сохраняет сопоставленный тип.
val naiveMappedValues = MyEnum.values.map(
implicitly[MyEnum.Value => MyEnum.MyEnum]).toArray
// REPL prints: naiveMappedValues: Array[MyEnum.Value] = Array(V1, V2)
Если MyEnum.values
сначала преобразуется в список, то тип конечного массива правильный.
val mappedValues = MyEnum.values.toList.map(
implicitly[MyEnum.Value => MyEnum.MyEnum]).toArray
// REPL prints: mappedValues: Array[MyEnum.MyEnum] = Array(V1, V2)
Почему это происходит? Почему необходимо сначала преобразовать ValueSet в список перед сопоставлением значений?