Implémentation type générique

Implémentation type générique - Java - Programmation

Marsh Posté le 04-12-2008 à 15:48:14    

Bonjour, j'ai un petit souci avec l'implémentation d'un type générique.
 
J'ai un type générique "Chainon<T>" avec lequel j'ai réalisé, dans une autre classe, l'implémentation du type "ListeChainee<T>". Avec ce dernier type, j'implémente un type "Ensemble<T>". Il est maintenant demandé, après avoir codé toutes les méthodes de la classe Ensemble, de réaliser sous formes de fonctions, et non de méthodes, les opérations ensemblistes classiques (union, intersection, différence). Ces fonctions devront retourner des ensembles.
 
Question, je sais pas où placer le code de ces fonctions. Dans la classe listeChainee? Dans le programme annexe qui teste la classe?
 
 
 public static Ensemble<T> union ( Ensemble<T> EnsA, Ensemble<T> EnsB ) {
 /*
  * code
         */
 }
 
A chaque fois le problème porte sur <T>
 
Dans le premier cas :
erreur: cannot make a static reference to a non-static type
 
Dans le deuxieme cas:
erreur: T cannot be resolved to a type
 
 
Quelqu'un pourrait-il m'éclairer ?

Reply

Marsh Posté le 04-12-2008 à 15:48:14   

Reply

Marsh Posté le 04-12-2008 à 16:10:45    

J'aurais tendance à les mettre dans la classe Ensemble perso. Ou alors dans une classe statique "Ensembles" qui contient ces fonctions, mais bon...

 

Mais dans tous les cas, ton problème est dans la définition de ta méthode statique: il faut lui donner la valeur pour le type générique T, et pour ce faire il te faut ajouter un paramètre générique comme montré dans generic methods and constructors:

Code :
  1. public static <T> Ensemble<T> union ( Ensemble<T> EnsA, Ensemble<T> EnsB )


le <T> seul étant le paramètre générique pour ta méthode.

 

Ensuite à l'utilisation, tu peux fournir le type explicitement:

Code :
  1. Sets.<String>union(setA, setB)


ou alors laisser le compilo inférer le type (pour du code aussi simple, il est habituellement capable de se débrouiller):

Code :
  1. Sets.union(setA, setB)


Message édité par masklinn le 04-12-2008 à 16:11:27

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 04-12-2008 à 16:55:09    

En fait, avec
      public static <T> Ensemble<T> union ( Ensemble<T> EnsA, Ensemble<T> EnsB )
 
que je rajoute donc dans ma classe ListeChainee, j'ai une nouvelle erreur pour les 3 derniers <T>:
 
Bound mismatch: The type T is not a valide substitute for the bounded parameter <T extends Comparable<T>> of the type Ensemble<T>
 
 
Je comprends pas, j'ai pas eu de problème dans des utilisation similaires des types génériques dans d'autres codes.

Reply

Marsh Posté le 04-12-2008 à 17:06:44    

divx-boy a écrit :

que je rajoute donc dans ma classe ListeChainee


Pourquoi? :sweat:  
 
Quel est le rapport entre une union d'ensembles et une liste chainée? :sweat:  

divx-boy a écrit :

Bound mismatch: The type T is not a valide substitute for the bounded parameter <T extends Comparable<T>> of the type Ensemble<T>
 
Je comprends pas, j'ai pas eu de problème dans des utilisation similaires des types génériques dans d'autres codes.


Ensemble est défini comment?


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 04-12-2008 à 17:09:34    

Au temps pour moi je voulais parler de la classe "Ensemble" ;)
 
Et ensemble est défini comme ceci:
 

Citation :


public class Ensemble <T extends Comparable <T> > {
 
 /*
  * attributs de classe
  */
 private ListeChainee <T> Lens;
 
 
 public Ensemble() {
  Lens = new ListeChainee <T> ();
 }
 
/*
 * méthodes
 */
 
}

Reply

Marsh Posté le 04-12-2008 à 17:20:39    

Ben c'est logique dans ce cas, il faut sûrement que le T de la méthode soit un sous-ensemble du T d'Ensemble, donc il faut probablement

Code :
  1. public static <T extends Comparable<T>> Ensemble<T> union ( Ensemble<T> EnsA, Ensemble<T> EnsB )


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 04-12-2008 à 17:29:55    

Ca fonctionne !
 
Merci ;)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed