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

avec Java Discussion :

Template - méthodes génériques et spécialisées


Sujet :

avec Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 121
    Points : 63
    Points
    63
    Par défaut Template - méthodes génériques et spécialisées
    Bonjour,

    Je souhaite utiliser une classe 'Cost' contenant une HashMap<Object, Integer>.
    Cette HashMap pourra être de type <String, Integer> ou <MultiKey, Integer>.

    Voici une version simplifiée de la classe correspondante :
    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
    import java.util.HashMap;
    import java.util.Iterator;
     
    public class Cost<Item> {
     
    	public HashMap<Item, Integer> costs;
     
    	public Cost(){
    		costs = new HashMap<Item, Integer>();
    	}
     
    	public int get(Object o){
    		if(costs.get(o) != null)
    			return costs.get(o);
    		else
    			return 1;
    	}
     
    	public void add(Item o, int val){
    		costs.put(o, val);		
    	}	
    }
    Dans le cas où la HashMap est de type <MultiKey, Integer>, je souhaiterais spécialiser la méthode add de la manière suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public void add(String s1, String s2, int val){
    		costs.put(new MultiKey(s1, s2), val);	
    		costs.put(new MultiKey(s2, s1), val);	
    	}
    Ceci me donne une erreur puisque la fonction put est défini pour des arguments de type (Item, Integer) et non (MultiKey, Integer).

    Comment puis-je spécifier que cette méthode add est à utiliser dans le cas où Item est de type MultiKey ?

    Merci d'avance !

  2. #2
    Membre chevronné
    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 : 75
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité nostalgique Java SE

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 257
    Points : 1 855
    Points
    1 855
    Par défaut
    je ne sais pas si c'est volontaire mais as-tu un type "Item"? dans ce cas c'est une erreur de définition tu as <Item> qui est un nom de type-paramètre et pas un nom de type fait plutot Cost<T>

    alors
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Cost <T> {
    }
     
    // puis 
    CostMultikey extends Cost<Multikey> {
        // ta méthode add 
    }
    non c'est pas ça?
    J'ai des principes: je peux toujours trouver une bonne raison pour les contredire .... mais j'ai des principes!
    (mon excellent bouquin sur Java : https://eska-publishing.com/fr/livre...822407076.html)

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 121
    Points : 63
    Points
    63
    Par défaut
    Non je n'ai pas de type "Item", c'est juste le nom que j'ai donné à la clé. J'ai récupéré l'idée dans un tutoriel et j'ai gardé la syntaxe.
    Dans ce cas cela convient ou il vaut tout de même mieux utiliser <T> ? (je demande au cas où Item serait utiliser pour d'autres choses que j'ignorerais)

    D'accord donc je suis obligé de dériver ma classe. Je me demandais si un mécanisme permettait de s'en passer.

    Merci beaucoup pour ta réponse.

  4. #4
    Membre chevronné
    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 : 75
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité nostalgique Java SE

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 257
    Points : 1 855
    Points
    1 855
    Par défaut
    Citation Envoyé par SAKDOSS Voir le message
    Dans ce cas cela convient ou il vaut tout de même mieux utiliser <T> ? (je demande au cas où Item serait utiliser pour d'autres choses que j'ignorerais)
    par convention , pour faciliter la lecture et éviter des erreurs il vaut mieux mettre un nom de paramètre type le plus simple possible comme <T> <T2> <K,V> <T,X> etc...
    J'ai des principes: je peux toujours trouver une bonne raison pour les contredire .... mais j'ai des principes!
    (mon excellent bouquin sur Java : https://eska-publishing.com/fr/livre...822407076.html)

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    121
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 121
    Points : 63
    Points
    63
    Par défaut
    D'accord c'est noté.

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

Discussions similaires

  1. Réponses: 19
    Dernier message: 23/12/2009, 19h22
  2. Réponses: 2
    Dernier message: 07/12/2009, 16h50
  3. [jse5/generics] Méthodes génériques
    Par palnap dans le forum Langage
    Réponses: 5
    Dernier message: 04/03/2008, 12h14
  4. template matrice générique
    Par troussepoil dans le forum Langage
    Réponses: 7
    Dernier message: 12/03/2007, 11h45
  5. Réponses: 7
    Dernier message: 01/01/2006, 03h28

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