IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

[POO] Transtypage nécessaire ?


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2015
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2015
    Messages : 34
    Par défaut [POO] Transtypage nécessaire ?
    Bonjour à tous. Je suis en train de redéfinir la méthode equals d'un objet :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    public boolean equals(Object obj) {
     
      if (this == obj)
        return true;
     
      if (getClass() != obj.getClass())
        return false;
     
      Ville other = (Ville) obj;
     
      return Objects.equals(other.getCategorie(), this.getCategorie()) &&
         Objects.equals(other.getNom(), this.getNom()) &&
         Objects.equals(other.getNombreHabitants(), this.getNombreHabitants()) &&
         Objects.equals(other.getNomPays(), this.getNomPays());
    }
    je ne comprends pas pourquoi lorsque je retire cette ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      Ville other = (Ville) obj;
    Mon IDE m'engueule.
    En effet, pourquoi est-ce que je ne peux pas utiliser obj et appeler les méthodes de la classe Ville avec, pourquoi est-ce que je suis obliger de transtyper, alors qu'à ce stade des tests, je suis sur qu'obj pointe vers un objet de type Ville?
    J'aimerai comprendre quel est la différence entre une variable de type Object qui pointe vers un objet Ville, et une variable de type Ville qui pointe vers un objet Ville.
    Merci à vous

  2. #2
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,


    Parce que Java est un langage fortement typé.
    Donc le compilateur ne te permet que d'appeler des méthodes existantes pour le type déclaré de la référence.

    Si la référence est de type Object, tu ne peux appeler QUE les méthodes déclarées dans la classe Object.
    Si la référence est de type Ville, tu ne peux appeler QUE les méthodes déclarées dans la classe Ville, ses classes parentes (dont Object) ou toutes les interfaces implémentées.

    Bref le type de la référence définis les méthodes que l'on peut utiliser, d'où le besoin de transtypage.


    Ceci est un choix du compilateur, qui permet d'éviter des erreurs à l'exécution.


    a++

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2015
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2015
    Messages : 34
    Par défaut
    Merci pour ta réponse.
    Ça veut dire que si je fais un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Object paris = new Ville()
    Je ne pourrai appeler aucune méthode de ma classe ville ??

  4. #4
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2015
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2015
    Messages : 34
    Par défaut
    Parce que dans mon cours :

    Vous aurez sans doute remarqué que je n'utilise que des objets Ville dans ma boucle : on appelle ceci la covariance des variables ! Cela signifie qu'une variable objet peut contenir un objet qui hérite du type de cette variable. Dans notre cas, un objet de type Ville peut contenir un objet de type Capitale. Dans ce cas, on dit que Ville est la superclasse de Capitale. La covariance est efficace dans le cas où la classe héritant redéfinit certaines méthodes de sa superclasse.

    Tu as raison, dans une variable de type Object, si j'instancie une ville je n'ai pas accès au méthodes de la classe ville, par contre, si j'ai redéfini des méthodes de Object dans ma classe Ville, alors même si ma variable est de type Object, c'est bien la méthode de la classe Ville qui est appelée, c'est cela le concepte de covariance ?

    J'ai créé une classe Capitale qui hérite de Ville, puis j'ai réécris la méthode decrisToi() de ma classe Ville dans ma classe Capitale, ensuite j'ai fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Ville v = new Capitale()
    Et en faisant un :
    C'est bien la méthode de Capitale qui est appelée

  5. #5
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Compassio Voir le message
    C'est bien la méthode de Capitale qui est appelée
    Parce que la vrai méthode a exécuté est déterminé à l'exécution.

    • Le compilateur ne peut se baser que sur le type déclaré, Donc pour lui v.decrisToi() génère un appel à la méthode Ville.decrisToi() sur l'instance v.
    • A l'exécution, la JVM va exécuter la méthode la plus adapté selon le type réel. Comme v est de type Capital qui redéfini la méthode decrisToi(), et c'est finalement cette méthode qui sera exécutée.




    Le rôle du compilateur est de s'assurer de la cohérence de l'appel.
    Celui de la JVM de déterminer le code à exécuter.


    a++

  6. #6
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Citation Envoyé par Compassio Voir le message
    Tu as raison, dans une variable de type Object, si j'instancie une ville je n'ai pas accès au méthodes de la classe ville, par contre, si j'ai redéfini des méthodes de Object dans ma classe Ville, alors même si ma variable est de type Object, c'est bien la méthode de la classe Ville qui est appelée, c'est cela le concepte de covariance ?
    Ça c'est plutôt le polymorphisme.

    La covariance c'est plutôt que si tu peux faire quelque chose avec un type A, tu peux faire cette même chose avec son sous-type B.
    Comme notamment appeler une méthode de A, ou assigner une de ses instances à une variable de type A.

    Forcément, le polymorphisme n'a d'intérêt que du fait de la covariance.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. [POO] fonction delete nécessaire?
    Par oodbae_adriano dans le forum MATLAB
    Réponses: 3
    Dernier message: 19/08/2011, 16h45
  2. [CR] Version nécessaire pour créer des fichiers DSR ?
    Par aysse dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 17/11/2003, 09h01
  3. [CR] erreur "groupe nécessaire ..."
    Par vb6dv dans le forum SAP Crystal Reports
    Réponses: 4
    Dernier message: 15/10/2003, 11h12
  4. lier un cube à un objet (POO)
    Par Hypnos dans le forum OpenGL
    Réponses: 12
    Dernier message: 26/08/2003, 21h46
  5. [transtypage]PChar et WideString
    Par rbag dans le forum Bases de données
    Réponses: 2
    Dernier message: 05/09/2002, 20h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo