2014-02-02 2 views
1

Я хочу реализовать с помощью Scala аналога следующего кода 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 только для примера, реальный алгоритм будет отличаться).

ответ

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 (определяется here):

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

scala> enumByPrefix("Mon",WeekDay).map(isWorkingDay) 
res3: Option[Boolean] = Some(true) 
Смежные вопросы