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

Collection et Stream Java Discussion :

Généricité et fonction Collections.sort


Sujet :

Collection et Stream Java

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Août 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2007
    Messages : 13
    Points : 8
    Points
    8
    Par défaut Généricité et fonction Collections.sort
    Bonjour à tous,

    Je me prends un peu la tête avec la généricité, et malgré mes lectures sur le net je ne comprends pas pourquoi ceci ne fonctionne pas :

    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
    53
    54
    55
     
    public static <T extends Comparable<? super T>> List<T> getListFromType(int iType)
    	{
    	ArrayList<T> list = null;
    	switch (iType)
    		{
    		case 1:
    			list = new ArrayList<Integer>();
    			list.add(4);
    			list.add(7);
    			list.add(1);
    			list.add(2);
    			break;
    		case 2:
    			list = new ArrayList<Double>();
    			list.add(4.);
    			list.add(0.1);
    			list.add(2.);
    			break;
    		case 3:
    			list = new ArrayList<String>();
    			list.add(new String("a"));
    			list.add("z");
    			list.add("e");
    			list.add("r");
    			list.add("t");
    			list.add("y");
    			break;
    		default:
    			break;
    		}
    	return list;
    	}
     
    public static <T extends Comparable<? super T>> void main(String[] args)
    	{
    	List<T> list1 = getListFromType(1);
    	Collections.sort(list1);
    	for (T item: list1)
    		{
    		System.out.println(item);
    		}
    	List<T> list2 = getListFromType(2);
    	Collections.sort(list2);
    	for (T item: list2)
    		{
    		System.out.println(item);
    		}
    	List<T> list3 = getListFromType(3);
    	Collections.sort(list3);
    	for (T item: list3)
    		{
    		System.out.println(item);
    		}
    	}
    j'ai des erreurs dans eclipse du style : Type mismatch: cannot convert from ArrayList<Integer> to ArrayList<T>

    pourtant Integer est bien, comme les autres classes utilisées :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    implements Comparable<Integer>
    Merci de vos éclairages...

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Ben oui, mais Integer n'est pas T. Il te faut un List<T>, ce que un List<Integer> n'est pas.

    Ce code étant assez mal ficelé pour utiliser les génériques (plutôt que de passer int iType, tu ferais mieux d'avoir 3 méthodes getIntegerList(), getDoubleList() et getStringList()) ; je ne peux pas te donner d'exemple pour le faire marcher.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    je crois, au vu de ton code, que ce que tu n'a pas compris, c'est que le type T est déterminé "par l'appelant" pas par la méthode. Donc, comme déjà dit, Integer/String/Double n'est pas T (et d'ailleurs dans ton main, tu fait alterner T de Integer à String joyeusement sans t'en soucier). Je crois que le code que tu cherche à réaliser est plutot dans ce gout là:

    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
    public static  List<? extends Comparable<?>> getListFromType(int iType)
    	{
    	ArrayList<? extends Comparable<?>> list = null;
    	switch (iType)
    		{
    		case 1:
                    {
                            ArrayList<Integer> mylist;
    			mylist = new ArrayList<Integer>();
    			mylist.add(4);
    			mylist.add(7);
    			mylist.add(1);
    			mylist.add(2);
                            list=mylist;
                    }
    			break;
    		case 2:
                    {
                            ArrayList<Double> mylist = new ArrayList<Double>();
    			mylist.add(4.);
    			mylist.add(0.1);
    			mylist.add(2.);
                            list=mylist;
                    }
    			break;
    		case 3:{
                            ArrayList<String> mylist = new ArrayList<String>();
    			mylist.add(new String("a"));
    			mylist.add("z");
    			mylist.add("e");
    			mylist.add("r");
    			mylist.add("t");
    			mylist.add("y");
                            list=mylist;
                    }
    			break;
     
    		default:
    			break;
    		}
    	return list;
    	}
    L'ennui c'est que le type retourné ne permet pas de l'utiliser dans Collections.sort (il n'y a plus de lien forcé entre le Type et le comparable<? super Type>. Il "faudrait" pour y arriver avoir droit à utiliser la capture de ? pour obtenir quelque chose dans ce gout-ci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    List<? extends Comparable<? super capture#1>>  getListFromType(int iType)
    malheureusement, ce n'est pas possible, java n'a pas de provision (que je connaisse) dans le language pour référencer le nième joker.


    De toutes façons, comme déjà mentionné, ce code est mal ficelé. Tu devrais avoir une méthode par type, puisque de toutes façons son code est différent.

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Août 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2007
    Messages : 13
    Points : 8
    Points
    8
    Par défaut
    L'ennui c'est que le type retourné ne permet pas de l'utiliser dans Collections.sort (il n'y a plus de lien forcé entre le Type et le comparable<? super Type>. Il "faudrait" pour y arriver avoir droit à utiliser la capture de ?
    C'est exactement ça le problème!

    J'ai en fait 4 listes de types différents, que je souhaite ordonner dans une seule et même fonction un peu après, et à priori je ne sais pas quelle liste est utilisée par l'utilisateur. C'est pour ça que je procédais comme ça... Enfin je peux toujours créer 4 fonction et tester quelle liste est non vide.

    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
    public List getListFromType() throws ScriptingFatalException
    	{
    	List list = null;
    	switch (m_iType)
    		{
    		case StateArray.ENUM:
    			list = m_alenuStates;
    			break;
    		case StateArray.NUMBER:
    			list = m_alnumStates;
    			break;
    		case StateArray.BOOLEAN:
    			list = m_alfStates;
    			break;
    		case StateArray.STRING:
    			list = m_alstrStates;
    			break;
    		default:
    			ExceptionUtils.throwTypeException();
    		}
    	return list;
    	}
    En tout cas merci pour votre aide rapide

  5. #5
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par Matthiews Voir le message
    C'est exactement ça le problème!

    J'ai en fait 4 listes de types différents, que je souhaite ordonner dans une seule et même fonction un peu après,
    Sauf que dans ton code, tu fais tout sauf ça, tu réfléchis à l'envers. Tu laisse l'utilisateur créer la liste qu'il veux avec les méthodes qu'il veux, puis te la passe à une vraie méthode générique, comme ceci:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public static <T extends Comparable<? super T>> void monBordelATrier(List<T> bordel){
    //.....
    Collections.sort(bordel);
    //......
    }
    et ton utilisateur appelle par exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    monBordelATrier(creerListeInteger());

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

Discussions similaires

  1. fonction std::sort() et visual C++
    Par maarek dans le forum C++
    Réponses: 6
    Dernier message: 29/08/2008, 18h40
  2. collections + sort + 2 arguments
    Par zorro13 dans le forum Collection et Stream
    Réponses: 5
    Dernier message: 06/02/2008, 13h38
  3. java.util.Collections.sort() je n'y comprends rien
    Par cmako dans le forum Collection et Stream
    Réponses: 6
    Dernier message: 17/09/2007, 14h01
  4. Collections.sort ne fonctionne pas
    Par lex13 dans le forum Collection et Stream
    Réponses: 7
    Dernier message: 12/07/2007, 11h13
  5. [collection] sort
    Par Invité dans le forum Langage
    Réponses: 5
    Dernier message: 10/04/2006, 11h58

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