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

Java Discussion :

Typage d'un paramètre d'une méthode issue d'une interface.


Sujet :

Java

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 32
    Par défaut Typage d'un paramètre d'une méthode issue d'une interface.
    Bonjour,

    J'ai un problème lié à l'utilisation d'une interface. Cette interface I possède une méthode avec un paramètre de type A.

    Je déclare une classe C qui implémente cette interface. Elle doit donc implémenter cette méthode. Je l'implémente donc mais en choisissant comme type du paramètre B qui étend la classe A. Mais j'ai une erreur de compilation : Le type C doit implémenter la méthode abstraite héritée I.method(A).

    Pourquoi ça ne marche pas ?

    Voici la structure du code pour une meilleure visibilité.
    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 class A {
     
    }
     
    public class B extends A {
     
    }
     
    public interface I {
    	public void method(A param);
    }
     
    public class C implements I {
    	public void method(B param); 
    }
    Merci d'avance.

  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,



    Tu ne respectes pas le contrat de l'interface, qui dit que tu dois avoir une method(A) que tu n'as pas.

    Si tu veux limiter le type il faut passer par les Generics...


    a++

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 32
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Salut,



    Tu ne respectes pas le contrat de l'interface, qui dit que tu dois avoir une method(A) que tu n'as pas.

    Si tu veux limiter le type il faut passer par les Generics...


    a++
    Merci de ta réponse mais je ne connais pas les generics... Comment les appliquer à mon exemple ?

  4. #4
    Membre Expert
    Avatar de professeur shadoko
    Homme Profil pro
    retraité nostalgique Java SE
    Inscrit en
    Juillet 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité nostalgique Java SE

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 257
    Par défaut
    tu t'engages sur ton honneur à prendre un A comme argument de méthode
    si tu passes un B ça marche, mais si tu passes un A ça marche pas! or tu t'es engagé à être capable de prendre un A!
    donc si ta classe C a une methode "method(A argument)"
    et tu fais "unC.method(unB)" ça marche! mais ta définition doit utiliser un A!

    edit: grilled!

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 32
    Par défaut
    Citation Envoyé par professeur shadoko Voir le message
    tu t'engages sur ton honneur à prendre un A comme argument de méthode
    si tu passes un B ça marche, mais si tu passes un A ça marche pas! or tu t'es engagé à être capable de prendre un A!
    donc si ta classe C a une methode "method(A argument)"
    et tu fais "unC.method(unB)" ça marche! mais ta définition doit utiliser un A!

    edit: grilled!
    Oui mais ceci est un exemple simplifié. En réalité, j'ai plusieurs classes héritant de A et plusieurs classes implémentant I avec à chaque fois une sous-classe de A en paramètre de la méthode. Comment résoudre mon problème de manière "propre" ?

  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 rocklass Voir le message
    Oui mais ceci est un exemple simplifié. En réalité, j'ai plusieurs classes héritant de A et plusieurs classes implémentant I avec à chaque fois une sous-classe de A en paramètre de la méthode. Comment résoudre mon problème de manière "propre" ?
    De fait, avec les génériques.

    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
    17
    public class A {
     
    }
     
    public class B extends A {
     
    }
     
    public interface I<E extends A> {
      public void method(E param);
    }
     
    public class C implements I<B> {
      public void method(B param) {
     
      }
    }
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 32
    Par défaut
    Citation Envoyé par thelvin Voir le message
    De fait, avec les génériques.

    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
    17
    public class A {
     
    }
     
    public class B extends A {
     
    }
     
    public interface I<E extends A> {
      public void method(E param);
    }
     
    public class C implements I<B> {
      public void method(B param) {
     
      }
    }
    Je testerai ça demain. Je dirai demain si mon problème est résolu. En tout cas, merci pour vos réponses

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 32
    Par défaut
    En réalité mon problème est un peu plus complexe que cela.

    En effet, la classe C n'implémente pas directement l'interface I, elle hérite de la classe abstraite K qui elle implémente l'interface.

    Que dois-je donc mettre au niveau des classes C et K pour implémenter cette interface ?

    Un petit résumé du problème ne fera pas de mal :

    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
    17
    18
    19
    20
    21
    public class A {
     
    }
     
    public class B extends A {
     
    }
     
    public interface I<E extends A> {
      public void method(E param);
    }
     
    public abstract class K implements I {
     
    }
     
    public class C extends K {
      public void method(B param) {
     
      }
    }
    Encore merci d'avance.

  9. #9
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public abstract class K<E extends A> implements I<E> {
     
    }
     
    public class C extends K<B> {
      public void method(B param) {
     
      }
    }
    Par exemple. Après ça dépend de la situation précise.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 32
    Par défaut
    Citation Envoyé par thelvin Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public abstract class K<E extends A> implements I<E> {
     
    }
     
    public class C extends K<B> {
      public void method(B param) {
     
      }
    }
    Par exemple. Après ça dépend de la situation précise.
    OK merci beaucoup pour ton aide, ça marche très bien

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

Discussions similaires

  1. Réponses: 10
    Dernier message: 05/02/2015, 14h47
  2. Réponses: 1
    Dernier message: 06/12/2012, 09h46
  3. Réponses: 2
    Dernier message: 05/01/2009, 12h45
  4. copie d'une table Y d'une base A vers une table X d'une base
    Par moneyboss dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 30/08/2005, 21h24
  5. [Reflection] Exécuter une méthode donnée d'une classe
    Par schousso dans le forum API standards et tierces
    Réponses: 4
    Dernier message: 03/06/2004, 10h35

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