无法在Slick GetResult提取器中确定枚举的原始类型

时间:2015-01-26 10:24:36

标签: scala slick

我有很多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的类型。还有其他解决方案来解决这个问题。

0 个答案:

没有答案