2012-03-29 11 views
3

Kann mir jemand sagen, was mit diesem Code falsch ist?Erhalte eine "No umschließende Instanz des Typs ..." Fehler

public abstract class BoardTestBean{ 
    protected String month; 
    protected String day; 
    protected String name; 


    public String getMonth() { 
     return month; 
    } 
    public void setMonth(String month) { 
     this.month = month; 
    } 
    public String getYear() { 
     return day; 
    } 
    public void setYear(String day) { 
     this.day = day; 
    } 
    public String getName(){ 
     return name; 
    } 


    //Classes 
    public class SAT { 
     boolean pre2005=false; 
     private String verbal; 
     private String quantitative; 
     private String writing="";//if pre-2005, do not set. It is not used. 

     public SAT() { 
      super(); 
      if(pre2005) 
       name="SAT (pre 2005)"; 
      else 
       name="SAT";    
     } 
     public SAT(String verbal, String quantitative, String writing) { 
      super(); 
      this.verbal = verbal; 
      this.quantitative = quantitative; 
      if(writing!=null && !writing.isEmpty()) 
       this.writing = writing; 
      else 
       pre2005=true; 
      if(pre2005) 
       name="SAT (pre 2005)"; 
      else 
       name="SAT"; 
     } 
     public String getVerbal() { 
      return verbal; 
     } 
     public void setVerbal(String verbal) { 
      this.verbal = verbal; 
     } 
     public String getQuantitative() { 
      return quantitative; 
     } 
     public void setQuantitative(String quantitative) { 
      this.quantitative = quantitative; 
     } 
     public String getWriting() { 
      if(!this.pre2005) 
       return writing; 
      else 
       return ""; 
     } 
     public void setWriting(String writing) { 
      this.writing = writing; 
     } 
     public boolean isPre2005() { 
      return pre2005; 
     } 
     public void setPre2005(boolean pre2005) { 
      this.pre2005 = pre2005; 
     } 
    } 
} 

Es sagt immer:

Keine umschließenden Instanz vom Typ AddBoardTestCommand.BoardTestBean zugänglich ist. Muss die Zuordnung mit einer einschließenden Instanz von Typ AddBoardTestCommand.BoardTestBean qualifizieren (z. B. x.new A(), wobei x eine Instanz von AddBoardTestCommand.BoardTestBean ist).

wenn ich versuche, dies zu tun: SAT-Bean = neue SAT(); mit SAT als AddBoardTestCommand.BoardTestBean.SAT importiert

Ich verstehe nicht, warum es mich fragt, die BoardTestBean Klasse zu initialisieren, wenn es abstrakt ist. Es soll nur die Werte für mehrere Unterklassen enthalten (SAT ist nicht die einzige Unterklasse. Ich habe einfach die anderen aus Gründen der Einfachheit weggelassen).

Kann mir jemand sagen, was los ist? Vielen Dank.

+1

möglich Duplikat [Java - Keine umschließenden Instanz vom Typ Foo zugänglich ist] (http://stackoverflow.com/ questions/9560600/java-no-umschließende-instance-of-type-foo-ist-zugänglich) – AnthonyW

+0

Mögliches Duplikat von [Es ist keine umschließende Instanz vom Typ Server verfügbar] (http://stackoverflow.com/questions/7901941/no -enclosing-instance-of-type-server-is-accessible) – Raedwald

Antwort

5

Dies liegt daran, SAT Klasse eine innere Klasse von BoardTestBean ist, aber keine statische innere Klasse. Nur statische innere Klassen können ohne einen "umschließenden" Instanzkontext instanziiert werden; Nicht-statische benötigen eine "Eltern" -Instanz.

Wenn SAT keinen der BoardTestBean Status verwenden muss, deklarieren Sie static; Andernfalls fügen Sie eine Instanzmethode zu BoardTestBean hinzu und instanziieren Sie SAT von dort.

P.S. Ich gehe davon aus, dass Sie aus demselben Paket auf SAT zugreifen, da es Paketsichtbarkeit hat. Wenn dies nicht beabsichtigt ist, müssen Sie auch die Klasse public erstellen.

EDIT Dies ist, wie Sie eine Instanz Methode BoardTestBeanSAT Rückkehr hinzufügen:

SAT makeSAT() { 
    return new SAT(); 
} 

Jetzt können Sie diese außerhalb BoardTestBean tun können:

// assuming that you have an instance of BoardTestBean... 
BoardTestBean myBean = ... 
BoardTestBean.SAT = myBean.makeSAT(); 
+0

Was meinen Sie mit "Wenn es keinen Status von BoardTestBean verwendet"? Es verwendet die Variable 'name' aus der Oberklasse.Es verwendet auch die Methoden getMonth und getYear. – Nacht

+0

@Nacht 'BoardTestBean' ist keine Superklasse von SAT, es ist seine * umschließende * Klasse. Ich habe die Antwort bearbeitet, um Ihnen ein Beispiel zu zeigen, wie Sie die Lösung im nicht-statischen Fall angehen können. – dasblinkenlight

+0

Unn, deine Antwort funktioniert, aber sie macht es komplexer, als ich es erwartet habe (die ursprüngliche Idee war, es kompakter zu machen und in Zukunft einfach zu debuggen). Trotzdem danke. – Nacht

2

Sie eine innere Klasse definiert, die eine hat versteckte dies zu seiner äußeren Klasse.

Just do

public static class SAT { 

und Sie erhalten eine verschachtelte Klasse ohne versteckte diese