常规类型的scala枚举值

时间:2015-01-10 11:23:04

标签: scala playframework

我的项目中有很少的scala枚举,如下所示:

object Tag extends Enumeration {
  type Tag = Value
  val BugFix, NewFeature, NewContent = Value

  implicit val tagFormat = EnumUtils.enumFormat(Tag)
}

其中标记格式的类型为play.api.libs.json.Format [Tag.Value]。它可以解析来自JSON的枚举,我也使用它来序列化为保存到DB的文本。为此,每个枚举也有这个代码:

def parse(s: String) = {
  tagFormat.reads(JsString(s)) match {
    case s: JsSuccess[Tag] => s.get
    case _ => throw new ParseException(s"String of: $s is not parsable into [${getClass.getName}}]", 0)
  }
}

我正在尝试将此代码提取到实用程序功能中。我的尝试如下:

def generalParse[A](format: Format[Enumeration.Value])(s: String) = {
  format.reads(JsString(s)) match {
    case s: JsSuccess[A] => s.get
    case _ => throw new ParseException(s"String of: $s is not parsable into [${getClass.getName}}]", 0)
  }
}

然后每个枚举只需要这个代码:

def parse(s: String) = generalParse[Tag](tagFormat)

问题是我无法弄清楚如何输入generalParse格式参数。 Enumeration.Value不起作用。我也尝试使用Any,它不起作用。

1 个答案:

答案 0 :(得分:0)

通常使用类型投影Enumeration#Value

scala> def f[A <: Enumeration] = Days.Mon match { case _: A#Value => }
f: [A <: Enumeration]=> Unit

scala> f[Days.type]

scala> f[Colors.type]

如果您想要有用的匹配,则需要使用外部值进行比较:

scala> def f[A <: Enumeration](a: A) = (Days.Mon: Any) match { case _: a.Value => }
f: [A <: Enumeration](a: A)Unit

scala> f(Days)

scala> f(Colors)
scala.MatchError: Mon (of class scala.Enumeration$Val)
  at .f(<console>:11)
  ... 33 elided