使用Enumerations作为类型参数

时间:2014-06-08 20:48:20

标签: scala enumeration

我想写一个这样的方法:

def validate[T <: Enumeration](input: String)(implicit enum: T) : Seq[T]

将接受输入(&#34; foo,bar,baz&#34;)并用逗号分隔 - 然后与给定的枚举进行比较。 例如,给定此枚举:

object Letter extends Enumeration {
  type Letter = Value
  val first = Value("A")
  val second = Value("B")
  val third = Value("C")
}

validate[Letter]("A,B,C,D")

的预期输出

将是:Seq[Letter](first,second,third)

我尝试过这样的事情:

val inputValues = input.split(",").toSeq
for {
  inputValue <- inputValues
  enumValue <- enum.values
  if enumValue.toString == inputValue
} yield enumValue

但它没有编译,因为类型系统......还有其他方法可以实现吗?

1 个答案:

答案 0 :(得分:2)

无法使用隐式枚举,但使用显式枚举似乎是可能的:

scala> import scala.util.Try
scala> def validate[T <: Enumeration](input: String,  enum: T):Seq[T#Value]  = {
     | val inputValues = input.split(",").toSeq
     | for (value <- inputValues if Try(enum.withName(value)).isSuccess) yield enum.withName(value) }
validate: [T <: Enumeration](input: String, enum: T)Seq[T#Value]

scala> validate("A,B,D", Letter)
res12: Seq[Letter.Value] = ArrayBuffer(A, B)