2009-11-04 9 views
6

Wie kommt es, dass dieser Code nicht kompiliert?Java: Wie kommt das Kompilieren?

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

Compiler berichtet:

enum declarations allowed only in static contexts. 

Aber dann, wenn ich die Enum A innerhalb Klasse setzen, alles ist in Ordnung.

Das ist ziemlich überraschend. Ich glaube nicht, dass ich dieses Problem in C++ habe.

Antwort

10

Sie können dieses Problem beheben, indem B machen statisch:

static class B { ... 

Dies spiegelt genauer, was C++ mit verschachtelten Klassen der Fall ist. Standardmäßig (ohne static) enthalten Instanzen von B eine versteckte Referenz auf eine Instanz von A.

Eine gute Erklärung der Unterschiede finden Sie unter Java inner class and static nested class.

+7

Ein Enum ist ein intrinsisch statisches Biest. Im obigen Beispiel wollen Sie immer nur ein Enum.AD-Objekt haben. Wenn Sie jedoch eine Enumeration in einer nicht statischen Klasse deklarieren, benötigen Sie (theoretisch) für jeden synamic-Bereich eine andere Instanz von Enum.AD. Das macht keinen Sinn ... deshalb ist es verboten. –