我有很多GetResult
提取器将字符串值转换为Enumeration
类型。这导致了很多样板代码,所以我想我可以为所有Enumeration
类型编写一个通用的提取器。
implicit def stringToEnum[T <: Enumeration : ClassTag] = new GetResult[T#Value] {
def apply(rs: PositionedResult) = {
val c = implicitly[ClassTag[T]].runtimeClass
val enum = c.getField("MODULE$").get(null).asInstanceOf[T]
val value = rs.nextString()
enum.toOpt(value).getOrElse(throw new Exception(
"Unexpected value: " + value + " for enum: " + enum.getClass.getName)
)
}
}
如果可能,toOpt
方法会将字符串值转换为Enumeration
值。
implicit class StringToEnum[T <: Enumeration](enum: T) {
def toOpt(action: String): Option[T#Value] = {
enum.values.find(_.toString == action)
}
}
代码编译得很好。但在运行时,Enumeration
类型被确定为scala.runtime.Nothing
,因此我无法获得对Enumeration
类型的引用。
有人可以解释为什么类型为scala.runtime.Nothing
而不是Enumeration
的类型。还有其他解决方案来解决这个问题。