Partage
  • Partager sur Facebook
  • Partager sur Twitter

classes abstraites et types génériques

    17 octobre 2016 à 12:40:59

    Bonjour,

    Voici mon problème : j'ai fait un programme sans types génériques, et je n'arrive pas à le faire avec types génériques. Voici les 4 classes sans types génériques :

    public class ListCarre extends ListParcours{ 
    	
    	public ListCarre(List<Integer> list){   
    		super(list);  
    	}  
    	 
    	public Object f(Object arg) {   
    		return ((Integer) arg)*((Integer) arg);  
    	}         
    }
    public class LongueurChaine extends ListParcours{
    
    
    	public LongueurChaine(List list) {   
    		super(list);  
    	} 
    	
    	
    	public Integer f(Object arg) {  
    		return ((String)arg).length();  
    	}
    
    }	 
    
    
    public abstract class  ListParcours{        
    	
    	private List list;    
    	
    	public ListParcours(List list) {   
    		this.list=list;  
    	}
    	
    	public abstract Object f(Object arg);
    	
    	
    	public List<Integer> getList(){
    		
    		List<Integer> listinteger = new ArrayList<Integer>();
    		
    		for(int i= 0; i<list.size(); i++){
    			listinteger.add((Integer)f((list.get(i))));
    		}
    		return listinteger;
    		
    	}
    	   
    	public void apply(){   
    		for (Object arg:list)
    			System.out.println("arg = " + arg + "f(" + arg + ")=" + f(arg)); 
    		}
    }
    public class Test {
    
    	public static void main(String[] args) {
    		   List<String> list = new ArrayList<String>( );   
    		   list.add("Bonjour"); 
    		   list.add("Le");   
    		   list.add("Monde");      
    		   LongueurChaine lc = new LongueurChaine(list);
    		   // on veut une liste de meme longueur que lc et dont   
    		   // chaque élément est un integer correspondant    
    		   // à la longueur de la chaine correspondante   
    		   List<Integer> listInteger = (List<Integer>)lc.getList( );  
    		   // affichage de cette chaine   
    		   System.out.println(listInteger);      
    		   // on veut une liste de meme longueur que listInteger et dont   
    		   // chaque élément est un integer correspondant au carré    
    		   // de l'integer correspondant dans listInteger        
    		   System.out.println(new ListCarre(listInteger).getList());     
    		   // la, on veut juste l'affichage des elements de la liste    
    		   // avec chaaue ligne sous la forme arg=..  f(arg)= ...   
    		   lc.apply( );  
    		   new ListCarre(listInteger).apply( );    
    		   // un dernier exemple   
    		   System.out.println(new ListCarre(new ListCarre(listInteger).getList( )).getList( )); 
    	  }
    	
    	}

    Le but est maintenant d'utiliser les types génériques pour la classe ListParcours. On nous dit que la classe LongueurChaine devient :

    public class LongueurChaine extends ListParcours<Integer,String>{
    
    
    	public LongueurChaine(List<String> list) {   
    		super(list);  
    	} 
    	
    	@Override
    	public Integer f(String arg) {  
    		return arg.length();  
    	}
    
    
    }	 
    


    Cependant, je n'arrive pas à trouver la solution...J'ai en particulier du mal à coder la méthode f. Quelqu'un pourrait-il m'éclairer?

    Merci d'avance!




    • Partager sur Facebook
    • Partager sur Twitter
      18 octobre 2016 à 0:14:33

      Salut.

      Bon, je suis pas sure de comprendre la finalité de tout ça sans énoncé, donc corriges moi si tu vois une incompréhension.

      A priori, getList transforme une liste x0, x1, x2, ..., xn en une liste f(x0), f(x1), f(x2), ..., f(xn) ? Avec une particularité sur la déclaration de f qui passe par un parametre Object pour être compatible peut importe l'objet.

      Je pense que ce qu'on attend de toi ici c'est simplement corriger cette fonction. En effet, elle prend en paramtre un objet quelconque (source d'erreurs) et renvois forcemment un Entier... On pourrait imaginer que tu veuilles un autre type de donné !

      Alors pour changer tout ça... Tu commence par rentrer la déclaration des types dans ta class

      public abstract class  ListParcours<T, V> { }

      Puis tu va changer toutes les occurences de String et Integer par la lettre les représentants. Par exemple tu ne créé pas une list<Integer> mais une list<T>. Tu va devoir changer la définition de la fonction f aussi...

      Tout ça amènera aussi des changements dans tes class, dans la déclaration du extends. Si tu utilise un IDE comme Eclipse, tu ne devrais pas avoir de mal à trouver ces erreurs.

      Bon courage !

      • Partager sur Facebook
      • Partager sur Twitter
        23 octobre 2016 à 11:39:58

        Salut Bizour,

        Merci pour ta réponse!

        -
        Edité par flora256coco123 6 novembre 2016 à 12:08:56

        • Partager sur Facebook
        • Partager sur Twitter
          6 novembre 2016 à 12:09:14

          Par contre, c'est au niveau de la définition de la fonction f que je bloque...car elle doit prendre un argument de type T ou V, mais comment faire cela?
          • Partager sur Facebook
          • Partager sur Twitter
            8 novembre 2016 à 16:48:16

            Salut

            Elle devient :

            public T f ( V obj )

            Tout simplement. T correspond au type de retour, et V au type reçu. En termes mathématiques on aurait dit que :

            F : T -> V

            Si tu as besoin de parcourir une liste de Villes et de retourner une liste de capitales, ta fonction sera sous la forme

            public class NomDeLaFonction extends ListParcours<Ville[],Capitales[]>;

            Il faut que tu comprennes qu'une fois la compilation passé (En C++ c'est, il me semble, à la compilation, en Java je ne suis pas sure, vu que c'est une classe à part entière mais bref, c'est des détails en ce qui te concerne),"T" EST l'objet auquel tu t'attendais.

            Bon courage

            • Partager sur Facebook
            • Partager sur Twitter

            classes abstraites et types génériques

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown