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();
    }
}

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.


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();

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.


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.