我的项目中有很少的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,它不起作用。
答案 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