声明返回枚举的泛型方法

时间:2014-02-02 14:22:27

标签: scala generics enums

我想用以下java代码的Scala模拟实现:

static <T extends Enum> T getEnumByPrefix(String prefix, Class<T> enumClass) {
    for (T enumValue : enumClass.getEnumConstants()) {
        if (enumValue.name().startsWith(prefix)) {
            return enumValue;
        }
    }
    throw new NoSuchElementException();
}

但我无法想象如何为scala.Enumeration声明方法。

我试过

def enumByPrefix[T <: Enumeration](prefix: String): T.Value = ...

但这不会编译。

我试过

def enumByPrefix[T <: Enumeration.Value](columnLabel: String): T = ...

但这也不能编译。

基本上我想按如下方式使用它:

object PaymentMethod extends Enumeration {
  val Insurance, Cash = Value
}
...
val paymentMethod: PaymentMethod.Value = enumByPrefix[PaymentMethod]("Insurance")

(我只使用了预览版,真实算法会有所不同)。

1 个答案:

答案 0 :(得分:2)

scala> def enumByPrefix[T <: Enumeration](prefix: String, enum:T):Option[enum.Value] = 
              enum.values.find(_.toString.startsWith(prefix))

enumByPrefix: [T <: Enumeration](prefix: String, enum: T)Option[enum.Value]

将其与WeekDay(已定义here)一起使用:

scala> enumByPrefix("Mon",WeekDay)
res2: Option[WeekDay.Value] = Some(Mon)

scala> enumByPrefix("Mon",WeekDay).map(isWorkingDay)
res3: Option[Boolean] = Some(true)