Как получить определение перечисления Enumeration Value? - PullRequest
3 голосов
/ 20 января 2010
object TestEnum extends Enumeration{
  val One = Value("One")
  val Two,Three= Value
}
println(TestEnum.One.getClass)
println(TestEnum.One.getClass.getDeclaringClass)//get Enumeration

Итак, мой вопрос, как получить Class [TestEnum] из TestEnum.One?

Спасибо.

Ответы [ 3 ]

7 голосов
/ 20 января 2010

Я не думаю, что вы можете, к сожалению. TestEnum.One действительно просто экземпляр класса Enumeration#Value. На самом деле, это намного хуже, чем просто это - все значения перечисления стираются по типу в одно и то же:

object Weekday extends Enumeration {
  val Mon, Tue, Wed, Thu, Fri, Sat, Sun = Value
}

def foo(w: Weekday.Value)
def foo(e: TestEnum.Value) //won't compile as they erase to same type

Так как экземпляры вашего перечисления являются просто экземплярами Enumeration#Value, их декларирующий класс просто scala.Enumeration.

Это печально, но кажется, что эти перечисления в scala хуже, чем бесполезны; если вы пропустите их через сериализацию (по крайней мере, в 2.7.7), то вы также не сможете проверять равенство!

2 голосов
/ 21 января 2010

Я собираюсь опубликовать ссылку на тип Enum, который я написал из-за ограничений, которые вы упомянули. Я не использую встроенный тип перечисления, так как считаю его очень ограниченным. Хотя у него нет функции, которую вы хотели бы (получить перечисление от элемента), было бы довольно просто добавить ее. Не стесняйтесь использовать его любым способом, если вы найдете это полезным.

(источник и тест / пример): http://gist.github.com/282446

Кстати, если вам нравится и вам нужна помощь по добавлению контейнера в EnumElement, дайте мне знать.

1 голос
/ 21 января 2010

На мой взгляд, существует простое решение, не связанное с перечислениями Scala: используйте взамен Java enum-s. Scala уже некоторое время поддерживает кросс-компиляцию, и просто добавить перечисление Java в исходную папку Scala.

...