N'est pas une classe englobante Java
Je suis en train de faire un jeu de Tetris et j'obtiens l'erreur de compilation
Shape is not an enclosing class
lorsque j'essaye de créer un objet
public class Test {
public static void main(String[] args) {
Shape s = new Shapes.ZShape();
}
}
Je suis en utilisant les classes internes pour chaque forme. Voici la partie de mon code
public class Shapes {
class AShape {
}
class ZShape {
}
}
Ce que je fais mal ?
new Shape().new ZShape();
. La classeZShape
besoins en joignant une instance pour être instancié.- déplacer intérieure de fichier séparé
- commentaire devrait être la réponse dans ce cas. Ils ne devraient pas être les classes internes. En les déplaçant d'Identifier les autres questions avec la Forme de classe qui existent.
- Ne pas répondre à la question ici, mais puis-je suggérer d'utiliser l'héritage ici où
AShape
etZShape
étendre la classe de baseShapes
. L'imbrication des classes n'est pas vraiment une bonne conception pour ce problème.
Vous devez vous connecter pour publier un commentaire.
ZShape
n'est pas statique, donc il faut une instance de l'extérieur de la classe.La solution la plus simple est de faire ZShape et de toute classe imbriquée
static
si vous le pouvez.Je voudrais également rendre tous les champs
final
oustatic final
que vous pouvez aussi bien.ZShape
static
totalement défait le but de ce qu'il essaie de faire, c'est d'instancier une copie deZShape
.static
c'est plus facile, pas plus dur.ZShape myShape = new Shape().instantiateZShape();
. Elle implique la ZShape vous obtenez ne peut pas exister sans une Forme, qui est l'intention, ici.static
à une classe, c'est probablement la bonne chose à faire.Supposons que RetailerProfileModel est votre classe Principale et RetailerPaymentModel est un intérieur de classe à l'intérieur. Vous pouvez créer un objet à l'Intérieur de la classe en dehors de la classe comme suit:
underTest = Mockito.mock(Outer.class).new InnerNonStaticClass();
Ce que je suggère n'est pas la conversion de la non-statique de la classe pour une classe statique, car dans ce cas, l'intérieur de votre classe ne peut pas accéder à la membres non statique de l'extérieur de la classe.
Exemple :
Alors, dans ce cas, vous pouvez faire quelque chose comme:
Outer.Inner obj = new Outer().new Inner();
()
est obligatoire. Cependant, le C, le C++ c'est pas un must. Ici c'est un exemple qui ne fonctionne pas. En outre, j'ai trouvé ce post. ce qui est d'expliquer plus sur la grammaire de Java et comment ils sont analysées. J'aimerais voir un exemple de cas lors de cette syntaxe est de travailler pour vous.Comme indiqué dans le docs:
Parfois, nous avons besoin de créer une nouvelle instance de l'un à l'intérieur de la classe qui ne peut pas être statique, car il dépend de certaines variables globales de la classe parent. Dans cette situation, si vous essayez de créer l'instance de l'un à l'intérieur de la classe qui n'est pas statique, un
not an enclosing class
erreur est renvoyée.Prenant l'exemple de la question, et si
ZShape
ne peut pas être statique, car il a besoin de la variable globale deShape
classe?Comment pouvez-vous créer une nouvelle instance de
ZShape
? C'est de cette façon:Ajouter un getter dans la classe parente:
Accès comme ceci:
J'ai rencontré le même problème.
J'ai résolu par la création d'une instance pour chaque intérieur Classe publique.
comme pour votre situation, je vous suggère d'utiliser l'héritage autre que les classes internes.
alors vous pouvez new Shape();
et visite ZShape par la forme.zShape;
Pas besoin de faire de la classe imbriquée comme statique, mais il doit être public
Une chose que je ne savais pas au début, quand la lecture de la accepté de répondre a que faire de l'un à l'intérieur de la classe statique est essentiellement la même chose que de le déplacer vers sa salle de classe.
Ainsi, lors de l'obtention de l'erreur
Vous pouvez le résoudre en soit de l'une des manières suivantes:
static
mot-clé à l'intérieur de la classe, ouDans le cas où si le Parent est la classe singleton utiliser de la manière suivante:
où
getInstance()
sera de retour parent de la classe objet singleton.Pour atteindre l'exigence de la question, nous pouvons mettre les classes dans l'interface:
et ensuite les utiliser comme auteur a essayé avant:
Si nous à la recherche de la bonne "logique" de la solution, doit être utilisé
fabric
modèle de conception