2011-04-05 19 views
13

Duplicar posibles:
Why do I get an Enum constant reference cannot be qualified in a case label?Error de compilación - switch con enumeración

Hola, ¿Alguien sabe por qué cuando cambio a través de una enumeración, los casos deben estar en el valor de enumeración no calificado ?

Ejemplo:

switch(var) { 

case Enum.FIRST: 

break; 

} 

es ilegal

pero:

switch(var) { 

case FIRST: 

break; 

} 

es legal.

Entiendo que var es de un tipo específico (Enum) pero ¿por qué le molesta al compilador si uso el nombre completo del valor Enum?

+0

Extrañamos el alcance en que esto se lleva a cabo, así como la enumeración definición, y el error de compilador citado en su totalidad. Gracias. –

+0

@usuario desconocido, la pregunta es bastante clara, creo que –

+0

La diferencia es el contexto. En el primer caso, es el valor en una instancia correspondiente (objeto). En el segundo caso, su variable de clase en Enum. El interruptor funciona en la variable definida en las instancias utilizadas en la cláusula switch. Está definido en especificaciones de esa manera. –

Respuesta

3

supongo porque de lo contrario se podría hacer algo como esto:

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

Pero en caso de que haga algo como esto, el compilador debería generar un error. Los compiladores "saben" que el conmutador está en Enum y no en AnyOtherEnum. – gads

+1

Sí, lo sabe. Pero al revés, ni siquiera puedes intentar hacer lo incorrecto –

+0

Supongo que tienes razón ... – gads

0

Debido a que usted está cambiando 'var' ya como "Enumeración", por lo que el caso Enum.FIRST sería "Enum.Enum. PRIMERO". Tipo de ;-)

+0

Pero el compilador "sabe" que es un Enum calificado, por lo que no debería tratar de encontrar "Enum.Enum.FIRST". Quiero decir, si el compilador ve una enumeración calificada en un caso, podría "entender" eso. – gads

8

Porque la Especificación del lenguaje Java establece que es así.

En concreto, el Defintition de un SwitchLabel:

SwitchLabel: 
     case ConstantExpression : 
     case EnumConstantName : 
     default : 

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

+1

Debo decir que no soy muy partidario de "porque así es como es", responde. – aioobe

+1

@aioobe ¿Incluso cuando es verdad? La razón por la cual el compilador se comporta de esta manera es porque así es como se define el lenguaje. Para averiguar por qué se define así, será necesario que quien haya escrito esa parte de la especificación se presente y lo diga. – developmentalinsanity

+0

¿Cree que alguna parte de la especificación está escrita por una sola persona? y que esta persona es la única que sabe por qué escribió lo que hizo? – aioobe

Cuestiones relacionadas