Как получить доступ к псевдониму типа универсального типа в Scala? - PullRequest
3 голосов
/ 23 ноября 2011

А именно, я хотел бы написать собственное значение для перечислений, так как этот метод теперь удаляется дизайнерами Scala (нечетный вызов - https://issues.scala -lang.org / browse / SI-4571 ).

def valueOf[E <: Enumeration](s : String) =
           E#Value.values.filter(it => it.toString==s).single()

Не обращайте особого внимания на single, это всего лишь Linq-подобная оболочка (см .: Таблица IEnumerable эквивалентов LINQ в Scala? ).

Проблема со значением E #.

Вопрос

Как правильно получить доступ к этому псевдониму, т.е. как получить доступ к псевдониму типа универсального типа? Пожалуйста, рассматривайте этот Enum как пример!

Существует метод withName, даже если он считается заменой, он разбит по конструкции, значение не является именем, поэтому я не буду использовать его, чтобы избежать дальнейшей путаницы в том, что код делает.

1 Ответ

5 голосов
/ 23 ноября 2011

Проблема с примером заключается в том, что перечисления объявляются как объекты. Экземпляр объекта не может быть найден на основе имени класса, поэтому незначительное изменение исправляет это. Кроме того, do для обобщений метод find уже отвлекся на абстрактный тип Value, объявленный в Enumeration, поэтому нам нужно добавить instanceOf для исправления типизации. Для универсальный псевдоним, E # Значение является правильным. Это обеспечивает хороший набор текста.

def valueOf[E <: Enumeration](enum: E, s : String): E#Value = 
  enum.values.find( { it => it.toString == s } ).get.asInstanceOf[E#Value]

object WeekDay extends Enumeration {
  val  Sun, Mon, Tue, Wed, Thu, Fri, Sat = Value
}
object Currency extends Enumeration {
  val USD, GBP, EUR = Value
}

val mySun: WeekDay.Value = valueOf(WeekDay,"Sun")
val myCur: Currency.Value = valueOf(WeekDay,"Sun") // fails to compile
...