Eine einschließende Instanz, die <meine Referenz> enthält, ist erforderlich

90

Eine enthaltende Instanz, die enthält, ist erforderlich

Unten ist der Code. positionObjist das Objekt, das ich verwenden möchte, und es gibt mir den obigen Fehler.

Es ist unklar warum.

package toolBox;
import toolBox.Secretary.positionObj;    

public class PositionManagement {
    public static HashMap<String, Secretary.positionObj> main(String vArg){
        positionObj newPosition=new positionObj();
    }
}
Jason m
quelle

Antworten:

129

Sie versuchen, die nicht statische innere positionObjKlasse zu verwenden, ohne dass eine Instanz Secretarydazu gehört.
Eine nicht statische innere Klasse muss zu einer Instanz ihrer übergeordneten Klasse gehören

Sie sollten wahrscheinlich positionObjzu einer normalen Klasse oder einer statischen inneren Klasse wechseln .

Alternativ können Sie schreiben someSecretary.new positionObj(), um eine Instanz der inneren Klasse zu erstellen, die zur someSecretaryInstanz gehört.

SLaks
quelle
vereinbart, aber diese allgemeine Aussage ist ein bisschen unklar. Können Sie mir ein Beispiel geben oder mich auf einen Punkt verweisen, der dies besser erklären könnte? danke
Jason m
Ja. Als ich versuchte zu debuggen, wurde mir klar, dass es funktionierte (in der Sekretärsklasse), wenn ich meine PositionObj auf statisch stellte. Ich bin glücklich und alles, was jetzt funktioniert, aber danke für den Hinweis. Untersucht die tatsächliche Ursache dieses Fehlers.
Jason m
2
Die eigentliche Fehlerursache ist, dass Sie keine übergeordnete Instanz angegeben haben. Verwenden Sie keine nicht statischen inneren Klassen, es sei denn, Sie benötigen wirklich eine und Sie verstehen, wie sie funktionieren . c2.com/ppr/wiki/JavaIdioms/NoPublicInnerClasses.html
SLaks
Beide Lösungen funktionieren einwandfrei [1 - die PositionObj-Klasse statisch machen und 2- OuterClass.new classObj () verwenden]. danke
Jason m
Ja. Sie müssen Ihre Codebasis jedoch gut genug verstehen, um herauszufinden, welche richtig ist.
SLaks
16

Erstellen Sie zuerst ein Objekt der äußeren Klasse. In diesem Fall denke ich "Sekretär". Dann erstellen Sie positionObj. So was,

Secretary x = new Secretary();
Secretary.positionObj y = x.new positionObj();
Teshan
quelle
DANKE! ... Ich habe Java seit Version 1.0 verwendet und wusste nicht, dass Sie das tun können!
Richard T
0

Die korrekte generische Signatur wäre

public static HashMap<String, positionObj> main(String vArg)

Sie müssen positionObj nicht qualifizieren, da Sie es bereits importieren.

Ich bin mir jedoch ziemlich sicher, dass eine Hauptmethode der folgenden Signatur entsprechen muss. Wenn Sie möchten, dass main die Hauptmethode für Ihr Programm ist, ändern Sie die Signatur in

 public static void main(String[] args) {...}

Sie können eine separate statische Methode erstellen, die eine Map zurückgibt und von main aus aufruft.

Als Hinweis sollten alle Klassen mit einem Großbuchstaben beginnen, positionObj sollte PositionObj sein.

hvgotcodes
quelle
Hey, habe einen Code ausgelassen. über den Fall vereinbart. Die Klasse gibt etwas zurück, aber der Fehler ist hier und ich bin mir nicht sicher warum.
Jason m
@ Jason, ich glaube nicht, dass Sie etwas von main zurückgeben können.
Hvgotcodes