声明泛型方法返回的枚举(Declare generic method returning enume

2019-09-30 07:37发布

我想下面的Java代码的斯卡拉模拟实现:

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")

(我用byPrefix只是举例,真实的算法会有所不同)。

Answer 1:

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 (定义在这里 ):

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

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


文章来源: Declare generic method returning enumeration