0
votes

La compilation échoue lorsque vous utilisez une concaténation ultra-stricale

J'ai la classe suivante, qui ne compile pas: xxx

Il donne l'erreur d'erreur de compilation Erreur de syntaxe sur jeton "super", expression invalide .

Est-ce que quelqu'un sait, pourquoi cette erreur de compilateur se produit? L'effet prévu serait "test" + super.tostring () , qui compilait bien, mais pourquoi l'exemple ci-dessus ne parvient-il pas à compiler? Les règles de Java normales ne devraient-elles pas s'appliquer ici?

encore plus surprenant que le code suivant compile bien: xxx

alors pourquoi Ce fonctionne dans la concision de chaîne tandis que Super n'est pas?

J'utilise OpenJDK 11.0.3 2019-04-16 , juste au cas où cela importe (ce que je doute).


0 commentaires

4 Réponses :


1
votes

simple: "super" ne peut pas être utilisé de cette façon.

Ce mot clé peut être utilisé pour appeler un super constructeur ou pour référencer une méthode / champ super. Mais il ne peut pas supporter "tout seul".

Comme il n'y a pas d'objet "super". Vous pouvez utiliser "Ceci" pour faire référence à "Cet objet", mais comme il n'y a pas d'objet "autonome". Donc, la langue ne vous permet pas d'utiliser "super" comme vous pouvez utiliser "Ceci".


3 commentaires

Eh bien, ce n'est pas un objet autonome, mais de ce que j'ai appris, il est simplement équivalent à une distribution de ce type au type de classe parent, qui force le compilateur à appeler la méthode de la classe mère .


@Doriangray je vous suggère de revoir ce sujet. Soit votre source est fausse ou vous y êtes mal interprété.


Eh bien, à partir du 15.11.2. Accéder aux membres de Superclass utilisant Super Le formulaire Super.Identifier fait référence au champ Identificateur nommé de l'objet actuel, mais avec l'objet actuel considéré comme une instance de la superclasse de la classe actuelle. Je pensais que "considéré comme" est à peu près la même chose que "cassed dans" .. également, plus en dessous des États-Unis dans l'exemple:: Au cours de la classe T3, l'expression Super.x est traitée comme si elle était suivante: ((T2) Cette x



2
votes

Le mot clé super en Java n'est pas une référence d'objet et vous recevez ainsi des erreurs dans votre code! Ce n'est pas une bonne pratique de le faire, car Super est un mot-clé pour découvrir la classe parent . Donc, vous ne pouvez pas imprimer en utilisant ce mot clé!

Selon Java Spec:

Les formulaires utilisant le mot-clé super sont valides uniquement dans une instance méthode, initialisateur d'instance, ou constructeur, ou dans l'initialisateur de une variable d'instance d'une classe. S'ils apparaissent ailleurs, un Une erreur de compilation sur la compilation se produit.


2 commentaires

Autant que je sache, c'est une référence d'objet à ceci étant lancé dans le type de classe parent. Je ne sais pas non plus comment le paragraphe que vous avez cité répondu à ma question, comme j'utilise Super dans une méthode d'instance.


Super n'est pas un objet normal, cela peut être utilisé seul. Super ne peut pas.



2
votes

Super code> USAGES:

  1. la déclaration super () code> est utilisé pour appeler le constructeur parent et peut être invoqué uniquement du constructeur de l'enfant. Il doit aussi être la première déclaration du constructeur de l'enfant. LI>
  2. super.instance_variable li>
  3. super.instance_mesthod li> ol>

    EG: P>

    class Animal {
        String name;
        Animal() { }
    
        String myName() {
            return name;
        }
    }
    
    class Dog extends Animal {
    
        Dog() {
            super();
        }
    
        public String toString() {
            return "Test " + super.myName() + super.name;
        }
    }
    


4 commentaires

Je ne parle pas de super () dans un appel de constructeur, mais à propos de l'utilisation de "test" + super dans une méthode appel. Je ne peux pas utiliser ce dans mon exemple car cela conduirait à une récursion infinie.


Il n'y a pas d'utilisation pour juste super.


@DorianGray Vous avez deux réponses en vous expliquant maintenant que l'utilisation de Super n'est pas possible comme ça. La vraie question est la suivante: quelle est votre méthode de tostring censée faire ?!


Eh bien, il serait censé être équivalent à "test" + super.tostring () dans l'exférence ci-dessus.



1
votes

Le mot clé super en soi n'est pas une expression Java valide. Le résumé de la réponse est que super n'est tout simplement pas utilisé de cette façon en Java.

Les types d'expressions suivants sont les productions de grammaire Java, y compris Super , dont aucune ne présente super par lui-même:

  • Accès sur le terrain Expressions

    • super. Identifiant Ce formulaire accède aux membres de la superclasse.

    • typename. super . Identifiant Ce formulaire accède aux éléments de superclasses de la classe entourant.

    • Invocation de la méthode Expressions

      • super. Identifiant ([ArgumentList]) Ce formulaire appelle une méthode de superclasse.

      • typename. super . Identifiant ([ArgumentList]) Ce formulaire appelle une méthode de superinterface ou une méthode de super-class dans une classe de joint, selon que typename est un nom de classe ou un nom d'interface.

      • Référence de la méthode Expressions

        • Super :: identifiant

        • typename. Super :: [Typeearguments] Identifiant

          En revanche, Ce est une expression, car il est autorisé à former un Expression primaire . Le mot-clé super par lui-même n'est pas dans cette liste de productions ni dans les sous-productions. Pensez à un «primaire» comme bloc de base d'une expression.

          primaire:

          primaireNonewarray

          ArrayCreationExpression

          primaireNonewarray:

          littéral

          Classliteral

          ceci

          typename. ceci

          ( expression )

          CLASSILSTANCECREATIONEXPRESSION

          FieldAccess

          ArrayAccess

          MéthodeInvocation

          méthodraference

          Le mot clé Ce fonctionne dans une expression car c'est un primaire, qui peut participer à des expressions plus compliquées et plus compliquées impliquant des opérateurs tels que + . .

          résumer, Super n'est impliqué que dans des productions plus importantes pour faire référence à des moyens spécifiques d'accéder à la superclasse. Le mot clé ceci , alors qu'il peut être impliqué dans des productions plus importantes, est autorisé par lui-même comme une expression primaire, ce qui lui permet de participer à des expressions plus compliquées à l'aide d'opérateurs.


0 commentaires