2011-04-05 77 views
13

可能重複:
Why do I get an Enum constant reference cannot be qualified in a case label?編譯錯誤 - 用枚舉開關

嗨, 是否有人知道爲什麼,當我切換枚舉,情況應該是不合格的枚舉值?

例子:

switch(var) { 

case Enum.FIRST: 

break; 

} 

是非法

但:

switch(var) { 

case FIRST: 

break; 

} 

是合法的。

我知道var是一個特定類型(Enum),但爲什麼編譯器會在乎我是否使用Enum值的完全限定名?

+0

我們想念在此發生的範圍,以及在Enum的定義,並完全引用的編譯器錯誤。謝謝。 – 2011-04-05 12:16:15

+0

@用戶不詳,問題很明確,我認爲 – 2011-04-05 12:19:02

+0

區別在於上下文。在第一種情況下,它在相應的實例(對象)中的值。第二種情況是Enum中的類變量。交換機對在switch子句中使用的實例中定義的變量起作用。它的規格定義如此。 – 2011-04-05 12:21:55

回答

3

我猜,否則你可以做這樣的事情:

switch(var) { 
    case AnyOtherEnum.FIRST: 
    break; 
} 
+0

但是,如果你做這樣的事情,編譯器應該提出一個錯誤。編譯器「知道」該開關在Enum上,而不是AnyOtherEnum。 – gads 2011-04-05 12:16:01

+1

是的,它知道。但相反,你甚至不能嘗試做錯事 – 2011-04-05 12:18:21

+0

我想你是對的... – gads 2011-04-05 12:28:53

0

因爲您切換「變種」已經是「枚舉」,這樣的情況下Enum.FIRST將是「Enum.Enum。第一」。種類;-)

+0

但是編譯器「知道」它是一個合格的枚舉,所以它不應該試圖找到「Enum.Enum.FIRST」。我的意思是如果編譯器在一個能夠「理解」的情況下看到一個合格的枚舉。 – gads 2011-04-05 12:25:12

8

因爲Java語言規範聲明它是這樣的。

具體來說,SwitchLabel的defintition:

SwitchLabel: 
     case ConstantExpression : 
     case EnumConstantName : 
     default : 

http://java.sun.com/docs/books/jls/third_edition/html/statements.html#258896

+1

我必須說,我不是很「資金」,因爲這就是它的方式。 – aioobe 2011-04-05 12:26:29

+1

@aioobe即使它是真的?編譯器行爲的原因是因爲這就是語言的定義。爲了找出爲什麼它的定義如此,需要誰寫出規範的那部分來出面說出來。 – developmentalinsanity 2011-04-05 12:31:42

+0

你認爲規範的任何部分是由一個人寫的?而且這個人是唯一知道他爲什麼這樣寫的人? – aioobe 2011-04-05 13:01:59