-2
votes

Pourquoi dois-je recevoir ce message d'erreur lorsque vous utilisez "Ceci" comme paramètre de méthode en Java?

J'ai lu récemment que ceci code> est une variable locale contenant un ID de référence de l'objet actuel et peut être utilisé à l'intérieur de n'importe quelle autre fonction. Mais quand j'ai explicitement déclarer ceci code> en tant qu'argument Int, je reçois une erreur d'heure de compilation indiquant: "Le type de récepteur ne correspond pas au type de classe enfermé".

class ThisDemo
{
    void show(int this)
    {
        System.out.println(this);
    }
}
class ThisDemo1
{
    public static void main(String... s)
    {
        ThisDemo a=new ThisDemo();
        int x=10;
        a.show(x);
    }
}


1 commentaires

Notez qu'il est réellement valide pour déclarer un paramètre (récepteur) nommé ceci . Il doit juste être le type correct. Ideone.com/wtgov1


3 Réponses :


-1
votes

Vous ne pouvez pas utiliser ceci code> pour nommer votre variable, puisqu'il s'agit d'un mot-clé réservé en Java. Ce code> fait référence à votre objet actuel (dans votre cas l'objet de la classe thisdemo code>). Je suppose que ce que vous voulez réaliser est le suivant:

class ThisDemo
{
    void show()
    {
        System.out.println(this);
    }
}
class ThisDemo1
{
    public static void main(String... s)
    {
        ThisDemo a=new ThisDemo();
        a.show();
    }
}


1 commentaires

Il est un cas explicite dans lequel vous pouvez utiliser ce comme nom d'une variable. Référence La réponse de Sauveur qui parle également de paramètres de récepteur (qui est le seul autre cas d'utilisation de ceci ).



-1
votes

Ce est un mot clé qui fait référence à l'instance actuelle d'une méthode ou d'un objet. Il est utilisé pour faire référence à l'objet qu'il fait partie de.

Pensez à un corps humain comme une classe. Parce que les instances de l'objet peuvent être appelées différentes choses comme John ou Kyle lors de la référence à un humain générique dans une méthode que vous utiliseriez. Exemple, pour obtenir votre battement de coeur pour tout humain, vous auriez quelque chose comme ça.Entheartbeat ().

Espérons que cela vous aide à conceptualiser cela.


0 commentaires

2
votes

Vous pourriez être confondu par le message d'erreur

Le type de récepteur ne correspond pas au type de classe enfermé

Selon les autres réponses, vous ne devriez pas pouvoir utiliser ceci comme paramètre (ou le déclarer comme une nouvelle variable), mais le message d'erreur indique quelque chose de complètement différent.

En fait, vous pouvez utiliser ceci comme paramètre, mais en un seul endroit: comme Paramètre de récepteur .

Le paramètre du récepteur est un périphérique syntaxique optionnel pour une instance. méthode ou constructeur de classe interne. Pour une méthode d'instance, le Le paramètre du récepteur représente l'objet pour lequel la méthode est invoqué. Pour un constructeur de classe interne, le paramètre du récepteur représente l'instance de joint immédiatement de la nouvelle construction objet. Dans les deux cas, le paramètre récepteur existe uniquement pour permettre le type de l'objet représenté à être noté dans le code source, de sorte que que le type peut être annoté (§9.7.4) . Le paramètre du récepteur n'est pas un paramètre formel; plus précisément, ce n'est pas une déclaration de type de variable (§4.12.3), il n'est jamais lié à une valeur transmise comme un argument dans une expression d'invocation de méthode ou une instance de classe expression de création, et cela n'a aucun effet à l'heure d'exécution.

pratiquement, il ressemblerait à xxx

et vous pouvez alors extraire le @Special Annotation via des moyens de réflexion réguliers. < / p>


4 commentaires

Pourquoi diable le feriez-vous jamais? Je pense que ce n'est pas bon d'encourager les gens à utiliser des anticipations. Simplement ne nommez jamais rien de ce . De plus, vous ne pouvez toujours pas faire cela dans les versions Java 7 et plus anciennes.


@Abnormalz: Ce n'est pas un anticipateur ... cela semble être un cas particulier. C'était explicitement ajouté à Java 8, disant donc que cela n'existait pas à Java 7 est discutable, semblable à la façon dont les flux n'existaient pas dans 7.


@abnormalz Ouais, je ne comprends pas pourquoi tu l'appelles un anticipateur. Cette fonctionnalité a été spécifiquement introduite pour permettre aux développeurs d'annoter l'instance du récepteur. Cela peut avoir des utilisations dans des bibliothèques de programmation orientées orientées par exemple. Ou certains outils d'analyse statique.


@Abnormalz En outre, je ne discute pas si vous devriez le faire , ma réponse explique simplement le message d'erreur et ce que cela fait référence à.