Étrange syntaxe pour l'instanciation d'un intérieur de classe
Je n'avais pas imagine que je voudrais rencontrer radicalement nouvelle syntaxe de Java est plus à ce stade, mais voilà, je viens de rencontré quelque chose:
Le contexte exact et que le code ci-dessous devrait faire est peu pertinent - c'est là juste pour donner une sorte de contexte.
Je suis en train de synthétiquement créer un événement dans CE Moulin Trousse, j'ai donc écrit ce genre de ligne:
buttonClick(new Button.ClickEvent(button));
Mais, Eclipse me donne le message d'erreur suivant:
Pas enfermer instance de type Bouton est accessible. Doivent être admissibles à l'allocation avec un enfermant instance de type Bouton (par exemple x.new A() où x est une instance de Bouton).
Quand je réécrire la ligne ci-dessus comme suit, il ne se plaint pas plus:
buttonClick(button.new ClickEvent(button)); //button instanceof Button
Donc, ma question est: Quelle est la dernière syntaxe veux dire, exactement, et pourquoi n'est-il pas le premier extrait de travail? Qu'est-ce que Java se plaindre, et de ce qu'il fait dans la deuxième version?
Des informations de base: les Deux Button
et Button.ClickEvent
sont non-résumé de cours publics.
- Question intéressante, mais le titre pourrait peut-être être plus sophistiqué.
- Libre à vous d'en suggérer d'autres. Je ne savais pas comment l'appeler la syntaxe à la fois, le titre demeure, malheureusement, aussi étrange.
Vous devez vous connecter pour publier un commentaire.
Les classes internes (comme
Button.ClickEvent
) besoin d'une référence à une instance de l'extérieur de la classe (Button
).Que la syntaxe crée une nouvelle instance de
Button.ClickEvent
avec l'extérieur de la classe de référence définie à la valeur debutton
.Voici un exemple - ignorer l'absence d'encapsulation etc, c'est juste pour les besoins de la démonstration:
Voir la section 8.1.3 de la spec pour en savoir plus sur les classes internes et en joignant les instances.
outer.new
construire.Bouton.ClickEvent est un non-statique à l'intérieur de la classe d'une instance de cette classe ne peut exister enfermé dans une occurrence de Bouton.
Dans votre deuxième exemple de code que vous avez une instance de Bouton et que vous créez une instance de ClickEvent ci-joint à cette occurrence de Bouton...
Un non-statique à l'intérieur de la classe en Java contient une face cachée de référence qui pointe vers une instance de l'extérieur de la classe elle est déclarée. Si le message d'erreur que vous avez obtenu à l'origine est vous dire que vous ne pouvez pas créer une nouvelle instance de l'intérieur de la classe sans préciser également une instance de l'extérieur de la classe pour qu'il soit attaché.
Peut-être la raison pour laquelle vous n'avez pas vu que la syntaxe avant, c'est que les classes internes sont souvent affectés dans une méthode de l'extérieur de la classe, le compilateur s'en charge automatiquement.
D'éviter la confusion entre vous et les amis programmateurs avec cette, rarement utilisé, fonctionnalité, vous pouvez toujours faire les classes internes static.
Dans le cas d'une référence à l'extérieur de la classe est nécessaire, vous pouvez passer explicitement dans le constructeur.
Vous pouvez faire ça, mais vous devez déclarer
ClickEvent
commestatic
à l'intérieur deButton
, et alors vous ne devriez avoir aucun problème à l'aide de vous sintax:Fondamentalement
static
rend la classeClickEvent
appartiennent directement à la classeButton
à la place d'une instance spécifique(c'est à direnew Button()
) deButton
.Suivant @Jon Skeet exemple:
Votre code de la compilation, vous avait tapé
au lieu de
buttonClick(new Button.ClickEvent(button));
comme un constructeur est une méthode et lorsque vous appelez une méthode en Java, vous devez passer à la liste d'arguments, même lorsqu'elle est vide.