Une instance englobante contenant <ma référence> est requise

91

Une instance englobante qui contient est requise

Ci-dessous le code. positionObjest l'objet que j'essaie d'utiliser et il me donne l'erreur ci-dessus.

On ne sait pas pourquoi.

package toolBox;
import toolBox.Secretary.positionObj;    

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

Réponses:

129

Vous essayez d'utiliser la positionObjclasse interne non statique sans instance de Secretarypour qu'elle appartienne.
Une classe interne non statique doit appartenir à une instance de sa classe parent

Vous devriez probablement passer positionObjà une classe normale ou à une classe interne statique.

Vous pouvez également écrire someSecretary.new positionObj()pour créer une instance de la classe interne qui appartient à l' someSecretaryinstance.

SLaks
la source
d'accord, mais cette déclaration générale est un peu floue. pourriez-vous me donner un exemple ou m'indiquer quelque part qui pourrait mieux expliquer cela? merci
jason m
Oui. J'ai réalisé en essayant de déboguer que si je rendais mon positionObj statique, cela fonctionnait (dans sa classe Secretary). Je suis heureux et tout cela fonctionne maintenant, mais merci pour le pointeur. Examinera la cause réelle de cette erreur.
jason m
2
La cause réelle de l'erreur est que vous n'avez pas donné d'instance parent. N'utilisez pas de classes internes non statiques sauf si vous en avez vraiment besoin et que vous comprenez comment elles fonctionnent . c2.com/ppr/wiki/JavaIdioms/NoPublicInnerClasses.html
SLaks
les deux solutions fonctionnent parfaitement [1- rendant la classe positionObj statique et 2- en utilisant OuterClass.new classObj ()]. merci
jason m
Oui. Cependant, vous devez comprendre suffisamment bien votre base de code pour déterminer laquelle est correcte.
SLaks
16

Créez d'abord un objet de classe Outer. Dans ce cas, je pense "secrétaire". Créez ensuite positionObj. Comme ça,

Secretary x = new Secretary();
Secretary.positionObj y = x.new positionObj();
Teshan
la source
MERCI! ... J'utilise Java depuis la version 1.0 et je ne savais pas que vous pouviez faire ça!
Richard T
0

La signature générique correcte serait

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

vous n'avez pas besoin de qualifier positionObj puisque vous l'importez déjà.

Cependant, je suis presque sûr qu'une méthode principale doit être conforme à la signature ci-dessous. Si vous avez l'intention de faire de main la méthode principale de votre programme, changez la signature en

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

vous pouvez créer une méthode statique distincte qui renvoie une carte et l'appelle à partir de main.

À noter que toutes les classes doivent commencer par une majuscule, positionObj, doit être PositionObj.

hvgotcodes
la source
hé, j'ai oublié du code. d'accord sur l'affaire. la classe renvoie quelque chose, mais l'erreur est là et je ne sais pas pourquoi.
jason m
@jason, je ne pense pas que vous puissiez renvoyer quoi que ce soit de main.
hvgotcodes