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 :

Implémentation d'interface et génériques


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    106
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Juin 2007
    Messages : 106
    Par défaut Implémentation d'interface et génériques
    Bonjour,

    J'ai deux interfaces à implémenter. Je suis en 1.6 et bien entendu ces interfaces ne sont pas modifiables. Les voici :

    Graph<P>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public interface Graph<P> {
        public P[][] getPoints();
        public P getPoint(int x, int y);
    }
    et

    Point
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public interface Point {
        public int getX();
        public int getY();
    }
    J'ai créé une implémentation de Point, PointImpl :

    PointImpl
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public class PointImpl implements Point {
        private int x; private int y;
        public PointImpl(int x, int y) { this.x = x ; this.y = y}
        public int getX() { return x;}
        public int getY() { return y;}
    }
    Jusqu'ici aucun problème... parcontre j'en recontre dans l'implémentation de Graph, GraphGrid :

    GraphGrid
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public class GraphGrid<P extends Point> implements Graph<P> {
        private final PointImpl[][] points;
     
        public GraphGrid(int width) {
            points = new PointImpl[width][width];
            for(int i = 0 ; i < width; i++) {
                 for(int j = 0 ; j < width; j++) points[i][j] = new PointImpl(i,j);
            }
        }
     
        public P[][] getPoints() { return points; }
        public P getPoint(int x, int y) { return points[x][y]; }
    }
    Je suis obligé de respecter les signatures des méthodes de l'interface graph... (getPoints et getPoint) mais le compilo me sort :
    cannot convert from PointImpl[][] to P[][]......

    Que dois-je donc réellement faire pour implémenter cette interface?

    Merci d'avance 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,


    Déjà la manipulation de tableau avec les Generics n'est pas évidente (car le typage n'est pas vérifié au même moment). Je te conseillerais plutôt d'utiliser des Collections bien plus souple...

    Ensuite tu mélanges généricité et typage fort. Ta classe GraphGrid utilise un type paramétré P mais en interne tu utilises un type fixe PointImpl. Ainsi getPoint() retourne en réalité un type PointImpl quel que soit le type P utilisé. Si je fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    GraphGrid<MaClassePoint> grid = new GraphGrid<MaClassePoint>(5);
    MaClassePoint point = grid.getPoint(0,0);
    getPoint() retournera un PointImpl alors que j'attends un MaClassePoint, et ces deux classes pourraient très bien n'avoir aucun lien direct si ce n'est qu'elles implémentent Point...
    Bref tu ne peut pas initialiser la grille dans le constructeur puisque tu ne connais pas le type exact utilisé...


    Exemple de code qui marcherait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class GraphGrid<P extends Point> implements Graph<P> {
        private final P[][] points;
     
     
        public GraphGrid(P[][] data) {
        	this.points = data.clone();
        }
     
        public P[][] getPoints() { return points; }
        public P getPoint(int x, int y) { return points[x][y]; }
    }
    a++

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    106
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Juin 2007
    Messages : 106
    Par défaut
    thank you !

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 08/02/2008, 13h01
  2. Réponses: 5
    Dernier message: 29/01/2008, 19h22
  3. Réponses: 7
    Dernier message: 16/07/2007, 09h59
  4. Réponses: 5
    Dernier message: 26/07/2006, 17h01

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