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 :

Héritage / Covariance / Java 5


Sujet :

Langage Java

  1. #1
    Membre éclairé Avatar de Akira
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    85
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2002
    Messages : 85
    Par défaut Héritage / Covariance / Java 5
    Bonjour je révise actuellement pour passer la certification sun java programmer et je bute sur cette question.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class Programmer {
     
        Programmer debug() {return this;}
     
    }
     
    class SCJP extends Programmer {
     
        Object debug() { return this;}
     
    }
    Pouvez vous m'expliquez pourquoi cela ne compile pas alors que SCJP étend bien Programmer qui étend "implicitement" Object. Puisque graçe à la covariance ce code compile:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class Programmer {
     
        Programmer debug() {return this;}
     
    }
     
    class SCJP extends Programmer {
     
        SCJP Object debug() { return this;}
     
    }
    Merci de votre aide.

  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,


    La covariance permet de modifier le type de retour lors d'une redéfinition de méthode (à partir de Java 5.0).
    Toutefois tout n'est pas permis et le contrat général de la classe parente doit être respecté. Ainsi le type de retour de la méthode doit être un sous-type de celui de la méthode parente.


    Pour mieux comprendre le problème je vais reprendre tes exemples en retournant un nouvel objet du type déclaré à la place de this. Dans ton premier exemple cela donnerais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class Programmer {
    	Programmer debug() {return new Programmer();}
    }
     
    class SCJP extends Programmer {
    	Object debug() { return new Object();}
    }
    Et si ce code compilait tu pouvais avoir un code du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Programmer p = new SCJP();
    Programmer p2 = p.debug(); // retournerait un Object !!!
    Or comme p est du type SCJP il retourne un Object qui n'est pas un Programmer ce qui fait que la référence p2 est incohérente (ce qui n'est normalement pas possible en Java).

    Pire tu pourrais avoir une méthode debug() décrite comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Object debug() { return new Integer(0);}
    Et je pense que tu es d'accord pour dire que cela n'a rien à voir avec un objet Programmer



    Mais si on prend le second exemple (j'ai corrigé ton code car la méthode debug() retournait SCJP Object mais je suppose qu'il s'agit d'un mauvais copier/coller )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class Programmer {
    	Programmer debug() {return new Programmer();}
    }
     
    class SCJP extends Programmer {
    	SCJP debug() { return new SCJP();}
    }
    Ici comme debug() retourne forcément un SCJP (ou une classe fille), on est sûr d'avoir un Programmer (ou plus précisément une classe fille), donc le code précédent fonctionne sans problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Programmer p = new SCJP();
    Programmer p2 = p.debug(); // retourne un SCJP ou une classe fille


    Plus d'info : Quelles sont les règles à respecter pour redéfinir/implémenter une méthode ?


    a++

  3. #3
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    C'est le contraire que t'as le droit de faire (Object pr ta première classe et Programmer pour la seconde)

  4. #4
    Membre éclairé Avatar de Akira
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    85
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2002
    Messages : 85
    Par défaut
    Merci beaucoup à tous les deux c'est beaucoup plus clair maintenant.

    A.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Mauvaise utilisation de l'héritage en Java ?
    Par AliFirat91 dans le forum Langage
    Réponses: 5
    Dernier message: 15/12/2011, 16h30
  2. probleme d'héritage en java
    Par lavoiture dans le forum Débuter avec Java
    Réponses: 1
    Dernier message: 21/11/2008, 16h59
  3. Héritage en java
    Par kayzer_59 dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 28/05/2008, 21h23
  4. Héritage en java
    Par caro_caro dans le forum Langage
    Réponses: 1
    Dernier message: 07/03/2008, 10h18
  5. Generics et héritage avec Java 5.0 Tiger
    Par euyeusu dans le forum Langage
    Réponses: 3
    Dernier message: 17/01/2007, 11h41

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