2009-11-04 15 views
6

¿Cómo es que este código no se compila?Java: ¿cómo es que esto no se compila?

class A 
{ 
    class B 
    { 
    public enum Enum <-- this line 
    { 
     AD, 
     BC 
    } 
    } 
} 

Compilador informa:

enum declarations allowed only in static contexts. 

Pero luego, cuando me pongo la enumeración de clase dentro de una, todo está bien.

Esto es bastante sorprendente. No creo tener este problema en C++.

Respuesta

10

Puede solucionar este problema al hacer B estática:

static class B { ... 

Esto refleja más de cerca lo que hace C++ con las clases anidadas. De forma predeterminada (sin static), las instancias de B contienen una referencia oculta a una instancia de A.

Se puede encontrar una buena explicación de las diferencias en Java inner class and static nested class.

+7

Una enumeración es una bestia intrínsecamente estática. En el ejemplo anterior, solo desea que haya un objeto Enum.AD. Pero si declaraste una enumeración dentro de una clase no estática, (en teoría) necesitarías una instancia diferente de Enum.AD para cada alcance sinamico. Eso no tiene sentido ... por lo tanto, está prohibido. –

Cuestiones relacionadas