2010-01-20 146 views
3
object TestEnum extends Enumeration{ 
    val One = Value("One") 
    val Two,Three= Value 
} 
println(TestEnum.One.getClass) 
println(TestEnum.One.getClass.getDeclaringClass)//get Enumeration 

所以我的問題是如何從TestEnum.One類[TestEnum]?如何獲取枚舉值的枚舉定義?

謝謝。

回答

7

我不認爲你不幸。 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)傳遞它們,那麼你也不能進行等式檢查!

+0

事實上,scala默認枚舉是可怕的,但它接近Java枚舉,你可以保存你的寫作爲簡單的枚舉:) – 2010-01-21 04:21:19

2

由於您提到的限制,我將發佈指向我編寫的枚舉類型的鏈接。我不使用內置的枚舉類型,因爲我覺得它非常有限。雖然它沒有你想要的功能(從一個元素獲得枚舉),但添加它會很微不足道。如果您覺得它有幫助,請隨時以任何方式使用它。

(來源&測試/例): http://gist.github.com/282446

BTW如果你喜歡並且希望幫助增加容器的EnumElement讓我知道。

+0

這是一個好主意,有什麼辦法可以減少編寫代碼嗎?像scala枚舉, – 2010-01-21 04:19:46

+0

不是我能想到的,它比scala枚舉具有更多的功能,所以這是一個折衷。該scala枚舉沒有一個字符串的元素(除非你說Mon(「Mon」)...),這是一個常見的用例。 – BenjaminJackman 2010-01-21 15:45:23

1

在我看來,有一個簡單的解決方案不處理Scala枚舉:改爲使用Java enum -s。 Scala支持一段時間的交叉編譯,只需在Scala源文件夾中添加一個Java枚舉就很容易。

+0

聽起來不錯,我會做出選擇,謝謝Erkki – 2010-01-22 10:26:52