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 :

Problème de polymorphisme


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Boucher
    Inscrit en
    Février 2016
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Boucher

    Informations forums :
    Inscription : Février 2016
    Messages : 14
    Par défaut Problème de polymorphisme
    Bonjour tous le monde.

    J'essaie de faire une classe vecteur qui utilise des coordonnées.

    La classe Coord est une classe abstraite et générique.
    J'ai un problème d'inférence de type semble-t-il.
    Je ne comprends pas pourquoi puisque _Coord étend Coord. Il devrait alors être en mesure d'utiliser la méthode.

    Voici mes trois classes.

    J'espère trouver une solution. Merci beacoup.

    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     
     
    /* PRE_MACRO use CartesianVector2d */
    /* LABEL CartesianVector2d 
     *import roomMap.CartesianVector2d;
    */
     
    import roomMap.Coord;
    import roomMap.Vector;
     
    class roomMap {
    	/* Run entry */
    	public static void main(String[] args){
    	/* PRE_MACRO use CartesianVector2d */
    	/* LABEL CartesianVector2d
    		CartesianVector2d v1 = new CartesianVector2d(2,0);
    		CartesianVector2d v2 = new CartesianVector2d(2,4);
    		System.out.print(v1);
    	*/
     
    	Coord<Double> p1;
     
    	}
    }
     
     
     
    package roomMap;
     
    public abstract interface Coord<_Number extends Number> {
    	public abstract Coord<_Number> getDiffFrom(Coord<_Number> c);
    }
     
     
     
     
    package roomMap;
     
    import roomMap.Coord;
     
    public class Vector< _Coord extends Coord<? /*extends Number*/> > {
    	private _Coord m_A;	//look if it is pointer :)
    	private _Coord m_B;
     
    	private _Coord m_direction;	//private setter
     
    	Vector (_Coord A, _Coord B) {
    		m_A = A;
    		m_B = B;
    		m_direction = A.getDiffFrom(B); // Le probleme semble etre ici
    	}
    }

  2. #2
    Membre averti
    Homme Profil pro
    Boucher
    Inscrit en
    Février 2016
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Boucher

    Informations forums :
    Inscription : Février 2016
    Messages : 14
    Par défaut
    J'ai aussi essayé avec ce changement dans Coord, au cas ou ca donnerait des idées.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    package roomMap;
     
    public abstract interface Coord<_Number extends Number> {
    	public abstract <_Coord extends Coord<_Number> > _Coord getDiffFrom(_Coord c);
    }

  3. #3
    Modérateur
    Avatar de Gugelhupf
    Homme Profil pro
    Analyste Programmeur
    Inscrit en
    Décembre 2011
    Messages
    1 326
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Analyste Programmeur

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 326
    Billets dans le blog
    12
    Par défaut
    Salut,


    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
    public interface Coord<N extends Number> {
        Coord<N> getDiffFrom(Coord<N> c);
    }
     
    public class Vector<N extends Number> {
        private Coord<N> m_A;
        private Coord<N> m_B;
        private Coord<N> m_direction;
     
        Vector (Coord<N> A, Coord<N> B) {
            m_A = A;
            m_B = B;
            m_direction = A.getDiffFrom(B);
        }
    }
    Note: Le mot-clé abstract est facultatif dans une interface, de même que le mot-clé public pour les méthodes d'une interface. Pense à suivre les conventions Java


    A+
    N'hésitez pas à consulter la FAQ Java, lire les cours et tutoriels Java, et à poser vos questions sur les forums d'entraide Java

    Ma page Developpez | Mon profil Linkedin | Vous souhaitez me contacter ? Contacter Gokan EKINCI

  4. #4
    Membre averti
    Homme Profil pro
    Boucher
    Inscrit en
    Février 2016
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Boucher

    Informations forums :
    Inscription : Février 2016
    Messages : 14
    Par défaut
    Merci Gugelhupf de la réponse.

    Je vais jeter un coup d'oeil sur l'impact du code en changeant la partie générique des Vector et des Point.

    Merci de l'information à propos de abstract et public pour les interfaces.

    Par pure curiosité, quelqu'un sait pourquoi le code ne fonctionnait pas? Un cast ou un paramètre à passer à javac pour modifier le comportement du linter est possible?

  5. #5
    Membre averti
    Homme Profil pro
    Boucher
    Inscrit en
    Février 2016
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Boucher

    Informations forums :
    Inscription : Février 2016
    Messages : 14

  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
    Non, ce n'est pas un bug du jdk, c'est une erreur dans ton code.

    Quand tu fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public abstract interface Coord<_Number extends Number> {
      public abstract Coord<_Number> getDiffFrom(Coord<_Number> c);
    }
    Ça peut se réécrire de manière lisible comme ça, c'est la même chose :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public abstract interface Coord<N extends Number> {
      public abstract Coord<N> getDiffFrom(Coord<N> c);
    }
    On voit que la getDiffFrom() nécessite en paramètre un objet Coord dont le paramétrage est N, c'est-à-dire le même que celui de la classe en cours. En gros, les objets Coord doivent appeler getDiffFrom() sur d'autres objets Coord, dont le typage paramétré doit être le même.

    Quand tu fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public class Vector< _Coord extends Coord<?>> {
    qu'on peut réécrire lisiblement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public class Vector<C extends Coord<?>> {
    Ça veut dire que le paramètre C est garanti d'être un sous-type de Coord<?>. C'est-à-dire de Coord, dont on ne sait pas trop quel est le paramétrage.

    Du coup, avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    private C m_A;
    private C m_B;
    Tu te retrouves avec deux variables, dont chacune a un type Coord<?>, c'est-à-dire chacune Coord dont on ne sait pas trop quel est le paramétrage.

    Et donc, notamment puisqu'on sait pas trop ce que c'est, on n'a aucune raison de penser que c'est le même paramétrage.

    Pas le même paramétrage => on peut pas appeler getDiffFrom() l'un sur l'autre, qui exige le même paramétrage.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. [Débutant] [POO]Problème de polymorphisme avec la méthode ToString()
    Par vmolines dans le forum C#
    Réponses: 5
    Dernier message: 08/02/2012, 00h19
  2. Problème de polymorphisme
    Par twixnoir dans le forum Langage
    Réponses: 5
    Dernier message: 06/06/2011, 23h16
  3. Réponses: 11
    Dernier message: 14/06/2010, 13h26
  4. Problème de polymorphisme
    Par oodini dans le forum Langage
    Réponses: 6
    Dernier message: 22/05/2010, 07h53
  5. Problème de polymorphisme
    Par Alain Defrance dans le forum C++
    Réponses: 6
    Dernier message: 14/03/2008, 17h03

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