keine einschließende Instanz vom Typ ... im Bereich

7

Ich untersuche innere Klassen von Java.

Ich habe ein Beispiel geschrieben:

%Vor%

Ich rufe es von main aus mit folgender Zeichenfolge auf:

%Vor%

Ich sehe Kompilierfehler:

%Vor%

Können Sie mir diese Situation erklären?

AKTUALISIEREN

    
gstackoverflow 01.03.2014, 16:34
quelle

2 Antworten

13

Inner ist eine innere Klasse. Sie kann nur erstellt werden, wenn eine umschließende Instanz der Klasse mit der Klassendefinition Inner vorhanden ist.

Sie haben jedoch eine verschachtelte Klasse static , Nested , erstellt, die von dieser Klasse ausgeht. Wenn Sie versuchen, den Superkonstruktor aufzurufen

%Vor%

Es wird fehlschlagen, weil der Superkonstruktor für Inner von einer Instanz von Outer abhängt, die nicht im Kontext static der Klasse Nested vorhanden ist. Jon Skeet bietet eine Lösung.

Eine Erläuterung der Lösung wird in der JLS angezeigt hier .

  

Superklassenkonstruktoraufrufe können unterteilt werden:

     
  • Unqualifizierte Superklassenkonstruktoraufrufe beginnen mit dem Schlüsselwort   super (möglicherweise mit expliziten Typargumenten vorangestellt).

  •   
  • Qualifizierte Superklassen-Konstruktoraufrufe beginnen mit einem Primary   Ausdruck.

         
    • Sie erlauben einem Unterklassenkonstruktor, das Neue explizit anzugeben   die umschließende Instanz des erstellten Objekts in Bezug auf die   direkte Oberklasse (§8.1.3). Dies kann notwendig sein, wenn die Oberklasse   ist eine innere Klasse.
    •   
  •   
    
Sotirios Delimanolis 01.03.2014, 16:37
quelle
14

Wie Sotirios gesagt hat, hat Ihre verschachtelte (nicht-innere) Klasse nicht implizit eine Instanz von Outer , die effektiv an die Inner übergeben wird.

Sie können dies jedoch umgehen, indem Sie explizit vor dem .super -Teil angeben:

%Vor%

Oder akzeptieren Sie es sogar als Parameter:

%Vor%

Allerdings würde ich Ihnen dringend empfehlen, einen solchen gewundenen Code zu vermeiden. Ich vermeide die meiste Zeit verschachtelte Klassen, benenne fast immer innere Klassen und ich kann mich nie erinnern, eine Kombination von ihnen so zu benutzen.

    
Jon Skeet 01.03.2014 16:41
quelle