Scala Enum要映射[无法证明...]

时间:2018-03-21 10:55:48

标签: scala enums hashmap

我有这个枚举:

object PhsIndType extends Enumeration{
  type PhsIndType = Value
  val A : Value = Value(1)
  val R : Value= Value(2)
  val O : Value = Value(3)
  val E : Value = Value(4)
}

我正在尝试将其加载到地图中以便于使用:

    val map = PhsIndType.values.toMap[AnyVal, AnyVal]

我尝试过使用我能想到的每种类型而不是AnyVal,但我总是得到错误:

Cannot prove that enumeration.PhsIndType.Value <:< (AnyVal, AnyVal).
val map = PhsIndType.values.toMap[AnyVal, AnyVal]

任何人都有修复?

感谢您的时间。

2 个答案:

答案 0 :(得分:1)

toMap的签名是:

toMap[T, U](implicit ev: A <:< (T, U)): immutable.Map[T, U]

这意味着底层集合需要具有Tuple2类型的元素。

PhsIndType.values的类型为PhsIndType.ValueSet,而非Tuple2类型

要获得所需的结果,您需要将基础集合转换为(T,U)Tuple2的类型,您可以通过映射来实现:

scala> :paste
// Entering paste mode (ctrl-D to finish)

  object PhsIndType extends Enumeration {
    type PhsIndType = Value
    val A : Value = Value(1)
    val R : Value= Value(2)
    val O : Value = Value(3)
    val E : Value = Value(4)
  }

  PhsIndType.values.map(x => (x.id, x)).toMap


// Exiting paste mode, now interpreting.

defined object PhsIndType
res0: scala.collection.immutable.Map[Int,PhsIndType.Value] = Map(1 -> A, 2 -> R, 3 -> O, 4 -> E)

答案 1 :(得分:0)

使用toMap

PhsIndType.values.map(x => x -> x.id).toMap

结果地图的类型可以是Map[PhsIndType.Value,Int]。您不需要Map[AnyVal, AnyVal]

Scala REPL

scala> PhsIndType.values.map(x => x -> x.id).toMap
res14: scala.collection.immutable.Map[PhsIndType.Value,Int] = Map(A -> 1, R -> 2, O -> 3, E -> 4)