Objet dans ArrayList , ainsi que <T>

mazout65 -  
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   -
Bonjour,
Voila je suis un etudiant en genie logiciel dans une universite au canada , je comprend pas 2 choses lors de mon tp ,la premiere etant le <T> apres une classe interface, que cela veut dire?
Si jai bien compris ca veut dire que il y a un parametre et que se parametre peut etre tout?
Ma deuxieme question est plus technique , Voila jai une classe ou je cree une Arraylist , dans cette arraylist jy stock des Objets , comment je peux acceder au fonction de lobjet, sachant que le arraylist n'est pas declare specialement pour cette objet?
je sais pas si cela a etais clair, merci de votre aide et desole pour les fautes...

2 réponses

bigbybob
 
Bonjour,

Alors plusieurs choses. le type <T> signifie "type générique". C'est à dire, par exemple, qu'il est possible de faire des ArrayList<String> qui ne contiendront que des Strings. On a donc une liste générique qui peut contenir n'importe quel type d'objet. Attention par contre, si on déclare une ArrayList<String>, on ne pourra utiliser que des Strings. Une dernière chose, il est déconseillé d'utiliser un type Object dans ce genre de liste car on peut facilement se perdre dans les types.

Voici un exemple d'utilisation avec une ArrayList<Object> pour montrer que c'est plutot relou de gérer tous les cas si on utilise différents types.

        ArrayList<Object> list = new ArrayList<Object>(); 
        list.add("En fait c'est une string"); 
        list.add(10); //donc un integer 
        list.get(0);    //recup l'élément 0, le premier donc 
        for (Object object : list) { //boucle qui va passer par tous les objets de la liste 
            if(object instanceof String){ 
                String monObjet = (String)object; 
                monObjet.split(" "); 
            }else if(object instanceof Integer){ 
                Integer monObjet = (Integer)object; 
                monObjet.doubleValue(); 
            } 
        } 


Comme on peut aussi le voir, on peut récupérer un élément en parcourant toute la liste, ou en faisant un get. Il suffit ensuite de caster l'objet vers le type concerné avec (String), (Integer), etc.

Si on veut pouvoir associer un objet à une clé unique, du genre "perso"=>Personne, il faudra se tourner vers les HashMap, on pourra alors récupérer notre objet avec un get("perso").
1
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
Remarque : sur l'utilisation de <T> on peut effectivement mettre n'importe quelle classe à la place, mais on peut aussi restreindre T à un sous-ensemble de classes grâce aux mots-clé extends et implements, ce qui permet d'accéder aux méthodes communes à ces sous-ensembles.

Exemple, en faisant une méthode paramétré de recherche de maximum pour des Comparable

public static <T extends Comparable<T>> T max(T...tab)
{
	T t = tab[0];
	for (int i=1; i<tab.length; i++)
		if (tab[i].compareTo(t)>0)
			t=tab[i];
	return t;
}

public static void main(String...Args)
{
	System.out.println(max(12,65,34));
	System.out.println(max("abc","gh","123"));		
}
0
mazout65 Messages postés 10 Date d'inscription   Statut Membre Dernière intervention  
 
jai dut mal mexprimer, car le probleme est pas la. en gros ce que je veux faire

public class A<T> \\ dans cette classe , il y a des get pour recup un numero de dossier par exemple

public interface B<T> \\ en gros une interface qui a des fonctions vide

public class C<T> implements B<T> \\ et dans cette fonction je cree une arraylist

ArrayList<T> list = new ArrayList<T>();

puis jai des fonctions qui permet de ajouter un element que je recoie en parametre dans larray etc, en gros dans le main je doi faire un new A puis je lenvoie en parametre a une methode de C qui lajoute dans list.

Mais imaginons, je veux voir si il existe pas deja dans la list un numero de dossier identique au nouveau, je fais comment pour acceder au get de la classe A dans mon arraylist? car si je fais list [i].getNumerodossier ba sa marche pas.... pourquoi?
0
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
"je doi faire un new A puis je lenvoie en parametre a une methode de C qui lajoute dans list."
Ce doit donc être une liste de type A qu'il faut faire : ArrayList<A<T>> liste.
Comme ça tu pourras faire liste.get(i).getNumeroDossier() sans problème.
0
mazout65 Messages postés 10 Date d'inscription   Statut Membre Dernière intervention  
 
je te remercie enormement, vraiment ;) meme si je conprend toujour pas lutilite du T, il sert a quoi lui la?
0
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
Ça dépend à quoi servent A, B, C... ce n'est pas très clair. On ne sait quasiment rien de ton projet à part qu'il y a des "numéros de dossiers". Le T pourrait par exemple définir leur type :

private T numeroDossier;

public T getNumeroDossier()
{
    return numeroDossier;
}

Tu peux ainsi traiter différents types de dossiers : ceux dont les "numéros de dossiers" sont des entiers (T=Integer : 1, 2, 3), des mots (T=String, "AB01", "XY123"), ou autre chose...
Evidemment ce n'est qu'un exemple, car à mon avis le T n'intervient pas à ce niveau, il faudrait voir le projet dans son ensemble pour comprendre à quoi il correspond.
0
mazout65 Messages postés 10 Date d'inscription   Statut Membre Dernière intervention  
 
je peux te lenvoyer par mail au pire
0
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
Le mieux c'est de le mettre ici, comme ça bigbybob, ou d'autres, pourront également comprendre ce dont il s'agit (c'est le principe du forum). Mais un T c'est fait pour être utilisé, regarde donc où il apparaît (généralement en argument ou en retour d'une méthode) pour savoir à quoi il sert. Mais des classes qui s'appellent A, B, et C, sont de toute évidence d'un intérêt très scolaire, où le "à quoi ça sert" n'a pas toujours de sens puisqu'il s'agit avant tout de savoir que ça existe.
0