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 :

une fonction Generics


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2007
    Messages
    41
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2007
    Messages : 41
    Par défaut une fonction Generics
    Re-bonsoir (eh oui, c'est mon deuxieme post ce soir ! )

    je ne connais pas très bien les Generics, mais je crois que ceux-ci peuvent m'être utiles pour ce que je fais.

    Je crée une fonction qui ajout un objet dans une liste. Seulement, j'ai quatres listes, et quatres types d'Objet.
    J'ai donc pour l'instant quatres fonctions qui font exactement la même chose, c'est un peu bête...

    La voici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    	public void ajoutMonObjet(int nbObjets)
    	{
    		for(int i=1; i<=nbObjets; i++) 
    		{
    			listeObjet.add(new Objet() );
    		}
     
    	}

    Est-ce possible d'implémenter cette fonction avec la méthode Generics pour pouvoir l'utiliser plusieur fois avec par exemple MonObjet1 que je met dans listeObjet1 et MonObjet2 que je met dans listeObjet2 ??

    Merci.

    Pirokkk.

  2. #2
    Membre émérite
    Avatar de LinkinSelim
    Profil pro
    Enseignant Chercheur
    Inscrit en
    Mars 2006
    Messages
    365
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Mars 2006
    Messages : 365
    Par défaut
    J'ai donc pour l'instant quatres fonctions
    deja faut prendre de bonnes habitudes, en java y'as plus de fonctions, on parle de methodes ...


    pour declarer une liste generic de String (par exemple) fais comme ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ArrayList<String> liste = new ArrayList<String>();
    pour ajouter des Objets a ta liste tu fais
    tu remarquera que la méthode add n'accepte que le type String (d'ou ArrayList<String>)

    j'espere que ca va t'aider

  3. #3
    in
    in est déconnecté
    Membre Expert Avatar de in
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    1 612
    Détails du profil
    Informations personnelles :
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 612
    Par défaut
    Pour que les generics te servent il faut que tes 4 types d'objets aient une relation de parenté. Par exemple si ils héritent tous d'une classe mère :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class parent {}
    class enf1 {}
    class enf2 {}
    class enf3 {}
    class enf4 {}
     
    List<parent> liste1 = new ArrayList<parent>
    // ou encore
    List<? extends parent> liste2 = new ArrayList <? extends parent>
    Enfin bref, il faut qu'ils aient un minimum en commun ...

  4. #4
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2007
    Messages
    41
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2007
    Messages : 41
    Par défaut
    Ah oui mince je me suis encore trompé en parlant de fonction...c'est un reflexe que j'ai du mal à corriger ! Veuillez m'en excuser.

    Sinon pour répondre à ta question in, mes quatre objets sont tous étendu d'une classe mère :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Objet1 extends ClasseMere
    Objet2 extends ClasseMere
    Objet4 extends ClasseMere
    Objet4 extends ClasseMere
    Et je déclare mes ArrayList d'objets comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    List<Objet1> listeMacons = new ArrayList<Objet1>();
    List<Objet2> listeMacons = new ArrayList<Objet2>();
    List<Objet3> listeMacons = new ArrayList<Objet3>();
    List<Objet4> listeMacons = new ArrayList<Objet4>();

  5. #5
    Membre chevronné Avatar de T`lash
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Saint-Pierre-Et-Miq.

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Septembre 2007
    Messages : 381
    Par défaut
    Si ce choix est fondamentalement important pour ta classe elle-même, tu en fais une classe générique et tu récupères le type donné en paramètre à ta classe pour typer ta liste.

  6. #6
    Expert confirmé
    Avatar de djo.mos
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    4 666
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 4 666
    Par défaut
    Bonjour,
    Au fait, en utilisant les generics, tu ne pourras plus instancier tes objets dans les méthodes ajoutMonObjet :-)
    Solution: passage par un factory (où par reflection, mais gore comme méthode).

    Bonne chance.

  7. #7
    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
    Citation Envoyé par djo.mos Voir le message
    Au fait, en utilisant les generics, tu ne pourras plus instancier tes objets dans les méthodes ajoutMonObjet :-)
    Solution: passage par un factory (où par reflection, mais gore comme méthode).
    Tu peux très bien cumuler réflection et generics. Seul défaut tu ne peux pas vérifier l'existence du constructeur vide à la compilation et tu dois donc gérer des exceptions mais c'est faisable (et pas si laid) :

    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    	// Appel newInstance en encapsulant les éventuelles exceptions dans une Runtime :
    	private static <T> T newInstance(Class<T> type) {
    		try {
    			return type.newInstance();
    		} catch (Exception e) {
    			throw new RuntimeException("No empty constructor", e);
    		}
    	}
     
    	public <T> void ajoutMonObjet(List<T> listeObjet, Class<T> type, int nbObjets) {
    		for(int i=1; i<=nbObjets; i++) {
    			listeObjet.add( newInstance(type) );
    		}
    	}
    a++

  8. #8
    Membre chevronné Avatar de bassim
    Homme Profil pro
    Ingénieur Réseaux
    Inscrit en
    Février 2005
    Messages
    666
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur Réseaux
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2005
    Messages : 666
    Par défaut
    Citation Envoyé par Pirokkk Voir le message
    Re-bonsoir (eh oui, c'est mon deuxieme post ce soir ! )

    je ne connais pas très bien les Generics, mais je crois que ceux-ci peuvent m'être utiles pour ce que je fais.

    Je crée une fonction qui ajout un objet dans une liste. Seulement, j'ai quatres listes, et quatres types d'Objet.
    J'ai donc pour l'instant quatres fonctions qui font exactement la même chose, c'est un peu bête...

    La voici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    	public void ajoutMonObjet(int nbObjets)
    	{
    		for(int i=1; i<=nbObjets; i++) 
    		{
    			listeObjet.add(new Objet() );
    		}
     
    	}

    Est-ce possible d'implémenter cette fonction avec la méthode Generics pour pouvoir l'utiliser plusieur fois avec par exemple MonObjet1 que je met dans listeObjet1 et MonObjet2 que je met dans listeObjet2 ??

    Merci.

    Pirokkk.
    heu, pourquoi ne pas ajouter qu'un objet à la fois pour ainsi pouvoir utiliser les Generics
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public void ajoutMonObjet(T objet)
    	{
    		listeObjet.add(objet);
     
    	}
    PS: je suis pas sur de la syntaxe, mais l'esprit est là

Discussions similaires

  1. Réponses: 2
    Dernier message: 17/08/2006, 14h50
  2. Comment chronométrer une fonction
    Par 323 dans le forum Pascal
    Réponses: 3
    Dernier message: 19/03/2003, 20h24
  3. [VBA-E] avec une fonction value
    Par laas dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 28/11/2002, 13h22
  4. [Turbo Pascal] Allocation et désallocation de pointeurs dans une fonction
    Par neird dans le forum Turbo Pascal
    Réponses: 13
    Dernier message: 17/11/2002, 20h14
  5. Une fonction avec des attributs non obligatoires
    Par YanK dans le forum Langage
    Réponses: 5
    Dernier message: 15/11/2002, 13h39

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