Partage
  • Partager sur Facebook
  • Partager sur Twitter

Probleme interface et généricité paramétrique

Sujet résolu
    12 janvier 2011 à 21:31:05

    Bonsoir j'ai un problème dans un exercice.
    Voici le sujet:
    J'ai une classe Colis avec des attributs (poids, etc..).
    J'ai une classe Transport générique qui comporte des méthode (embarque, listing, livrer, etc..).
    J'ai une interface ElementTransporte.

    J'ai un main qui ce trouve dans la class Colis avec 3 Colis créer ainsi que un Transport de Colis.
    Les 3 Colis sont embarqué dans la cargaison, j'ai un affichage du listing de la cargaison et un affichage de la nouvelle cargaison apres la livraison d'un des 3 Colis.

    Colis.java:
    package janvier_2010;
    
    public class Colis
    {
      private double poids;
      private String origine;
      private String destination;
      private String identification;
    
      public double poids() {return poids;}
      public String origine() {return origine;}
      public String destination() {return destination;}
      public String identification() {return identification;}
    
      public Colis() {}
    
      public Colis(double poids, String origine, String destination, String identification)
      {
        this.poids = poids;
        this.origine = origine;
        this.destination = destination;
        this.identification = identification;
      }
    
    
      public static void main(String[] args)
      {
        Transport<Colis> T1 = new Transport<Colis>(); 
        
        Colis C1 = new Colis(123, "france", "USA", "Ordinateur");
        Colis C2 = new Colis(123, "belgique", "afrique", "portable");
        Colis C3 = new Colis(123, "suede", "asie", "tableau");
    
        T1.embarque(C1);
        T1.embarque(C2);
        T1.embarque(C3);
    
        System.out.println(T1.listingCargaison());
        System.out.println(T1.livrer("USA"));
      }
    }
    


    Transport.java :
    package janvier_2010;
    
    import java.util.Vector;
    
    public class Transport<T implements ElementTransporte> extends Colis
    {
      private Vector<T> cargaison = new Vector<T>();
    
      public Transport()
      {
        cargaison = new Vector<T>();
      }
    
      public void embarque(T t)
      {
        cargaison.add(t);
      }
    
      public String listingCargaison()
      {
        String listing = "";
    
        for(T t : cargaison)
        {
          listing += t.identification() + " ";
        }
    
        return listing;
      }
    
      public Vector<T> livrer(String destination)
      {
        Vector<T> aLivrer = new Vector<T>();
    
        for (T t : cargaison)
        {
          if (t.destination().equals(destination))
          {
    	aLivrer.add(t);
          }
          cargaison.remove(aLivrer);
        }
        
        return aLivrer;
      }
    }
    


    ElementTransporte.java:

    package janvier_2010;
    
    import java.util.Vector;
    
    public interface ElementTransporte
    {
      Vector<T> livrer(String destination);
    }
    



    J'ai un problème au niveau de la liaison des classes entre elles et avec l'interface, je m'embrouille un peu.

    Erreur:
    Transport.java:5: > expected
    public class Transport<T implements ElementTransporte> extends Colis
                            ^
    Transport.java:5: '{' expected
    public class Transport<T implements ElementTransporte> extends Colis
                                                         ^
    2 errors


    Merci
    • Partager sur Facebook
    • Partager sur Twitter
      13 janvier 2011 à 0:10:02

      Je ne comprends pas la logique de ça :
      public class Transport<T implements ElementTransporte> extends Colis
      

      Est-ce qu'on peut dire "un Transport est un Colis" ?

      Non ? Dans ce cas "Transport" ne peux pas étendre "Colis".

      Par contre "Colis" devrait implémenter "ElementTransporte" (un colis est un élément transporté).

      Avec ça tu devrais prendre les choses dans le bon ordre et pouvoir continuer ton exercice.

      Au fait : on est en janvier 2011 ;)

      PS : Il n'y a plus aucune raison d'utiliser Vector depuis 1998. Il faudrait pendre les profs qui ne se sont toujours pas mis à jour avec leurs tripes (quoique le tien a appris la généricité, c'est djéà pas mal).
      Utilise les List à la place.
      • Partager sur Facebook
      • Partager sur Twitter
        13 janvier 2011 à 11:23:12

        Merci de ta réponse.

        Pour le janvier 2010 c'est parceque c'est le sujet du partiel de l'an dernier, je m'entraine pour passer celui de janvier 2011^^

        Pour les Vector, j'y peut rien c'est posé avec Vector dans l'énoncé, moi personnellement j'aurai utilisé ArrayList.

        Bon pour le problème, dans la classe Colis, j'ai rajouté "implements ElementTransporte" et dans la classe Transport j'ai enlevé le "extends Colis", j'ai donc seulement "public class Transport<T implements ElementTransporte>"

        J'obtient toujours la même erreur:
        Transport.java:5: > expected
        public class Transport<T implements ElementTransporte>
                                ^
        Transport.java:5: '{' expected
        public class Transport<T implements ElementTransporte>
                                                             ^
        2 errors


        Ensuite j'ai essayé avec ceci : "public class Transport<T extends ElementTransporte>", j'ai mis "extends" à la place de "implements", j'obtient ces erreurs:
        ElementTransporte.java:7: cannot find symbol
        symbol  : class T
        location: interface janvier_2010.ElementTransporte
          Vector<T> livrer(String destination);
                 ^
        Colis.java:3: janvier_2010.Colis is not abstract and does not override abstract method livrer(java.lang.String) in janvier_2010.ElementTransporte
        public class Colis implements ElementTransporte
               ^
        Transport.java:25: cannot find symbol
        symbol  : method identification()
        location: interface janvier_2010.ElementTransporte
              listing += t.identification() + " ";
                          ^
        Transport.java:37: cannot find symbol
        symbol  : method destination()
        location: interface janvier_2010.ElementTransporte
              if (t.destination().equals(destination))
                   ^
        4 errors


        Voici le nouveau code:

        package janvier_2010;
        
        public class Colis implements ElementTransporte
        {
          private double poids;
          private String origine;
          private String destination;
          private String identification;
        
          public double poids() {return poids;}
          public String origine() {return origine;}
          public String destination() {return destination;}
          public String identification() {return identification;}
        
          public Colis() {}
        
          public Colis(double poids, String origine, String destination, String identification)
          {
            this.poids = poids;
            this.origine = origine;
            this.destination = destination;
            this.identification = identification;
          }
        
        
          public static void main(String[] args)
          {
            Transport<Colis> T1 = new Transport<Colis>(); 
            
            Colis C1 = new Colis(123, "france", "USA", "Ordinateur");
            Colis C2 = new Colis(123, "belgique", "afrique", "portable");
            Colis C3 = new Colis(123, "suede", "asie", "tableau");
        
            T1.embarque(C1);
            T1.embarque(C2);
            T1.embarque(C3);
        
            System.out.println(T1.listingCargaison());
            System.out.println(T1.livrer("USA"));
          }
        }
        


        Transport.java:
        package janvier_2010;
        
        import java.util.Vector;
        
        public class Transport<T extends ElementTransporte>
        {
          private Vector<T> cargaison = new Vector<T>();
        
          public Transport()
          {
            cargaison = new Vector<T>();
          }
        
          public void embarque(T t)
          {
            cargaison.add(t);
          }
        
          public String listingCargaison()
          {
            String listing = "";
        
            for(T t : cargaison)
            {
              listing += t.identification() + " ";
            }
        
            return listing;
          }
        
          public Vector<T> livrer(String destination)
          {
            Vector<T> aLivrer = new Vector<T>();
        
            for (T t : cargaison)
            {
              if (t.destination().equals(destination))
              {
        	aLivrer.add(t);
              }
              cargaison.remove(aLivrer);
            }
            
            return aLivrer;
          }
        }
        



        ElementTransporte.java:

        package janvier_2010;
        
        import java.util.Vector;
        
        public interface ElementTransporte
        {
          Vector<T> livrer(String destination);
        }
        
        • Partager sur Facebook
        • Partager sur Twitter
          13 janvier 2011 à 11:27:41

          On ne s'est pas compris : les changements que je propose nécessitent sans doute de réécrire le code.
          Les messages d'erreur en eux-même sont assez clairs et devraient te donner une idée précise des problèmes.
          • Partager sur Facebook
          • Partager sur Twitter
            13 janvier 2011 à 11:30:50

            oui mais ce que je ne comprend pas c'est que si j'enleve a la classe Transport le "extends Colis", j'ai plus accés aux méthodes et attributs de la classe Colis.
            Car dans la fonction "livrer" de la classe Transport, elle appel la méthode "destination()" de la classe Colis


            [EDIT]: je me rapproche je pense.
            J'ai essayé ceci :

            ElementTransporte.java:
            package janvier_2010;
            
            import java.util.Vector;
            
            public interface ElementTransporte
            {
              public String identification();
              public String destination();
            }
            



            Transport.java :
            package janvier_2010;
            
            import java.util.Vector;
            
            public class Transport<T extends ElementTransporte>
            {
             public String identification() {return identification;}
             public String destination() {return destination;}
            
              private Vector<T> cargaison = new Vector<T>();
            
              public Transport()
              {
                cargaison = new Vector<T>();
              }
            
              public void embarque(T t)
              {
                cargaison.add(t);
              }
            
              public String listingCargaison()
              {
                String listing = "";
            
                for(T t : cargaison)
                {
                  listing += t.identification() + " ";
                }
            
                return listing;
              }
            
              public Vector<T> livrer(String destination)
              {
                Vector<T> aLivrer = new Vector<T>();
            
                for (T t : cargaison)
                {
                  if (t.destination().equals(destination))
                  {
            	aLivrer.add(t);
                  }
                  cargaison.remove(aLivrer);
                }
                
                return aLivrer;
              }
            }
            


            voici les 2 erreurs maintenant:
            Transport.java:7: cannot find symbol
            symbol  : variable identification
            location: class janvier_2010.Transport<T>
             public String identification() {return identification;}
                                                    ^
            Transport.java:8: cannot find symbol
            symbol  : variable destination
            location: class janvier_2010.Transport<T>
             public String destination() {return destination;}
                                                 ^
            2 errors


            La je ne comprend pas pourquoi par contre :(
            • Partager sur Facebook
            • Partager sur Twitter

            Probleme interface et généricité paramétrique

            × 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