[java 1.5] problème de type

problème de type [java 1.5] - Java - Programmation

Marsh Posté le 04-01-2005 à 20:04:34    

Bonjour, mon fichier GraphMapUtil ne compile pas :(.
 
C'est une classe qui ne contient que des fonction statiques
Voici le contenu de la fonction dans laquelle ça plante :

Code :
  1. static<T,V> DirectedGraphMap<Set<T>,Set<T>>
  2.     grapheIdeaux(DirectedGraphMap<? extends Set<T>,V> g) {
  3.             //OK
  4.             ArrayList<? extends Set<T>> topoSort;
  5.             //OK
  6.             topoSort = topologicSort(g);
  7.             //OK
  8.             Iterator<? extends Set<T>> topoIt = topoSort.iterator();
  9.             //OK
  10.     while(topoIt.hasNext()) {
  11.                 //OK
  12.         Set<T> node = topoIt.next();
  13.                 //ci-dessous ça merde :cry:
  14.         Iterator<? extends Set<T>> pred = g.keySet(node, false).iterator();
  15.                 ...
  16.             }
  17. }


 
Voici le prototype de la fonction keySet() dans DirectedGraphMap :

Code :
  1. public interface DirectedGraphMap<K,V> extends GraphMap<K,V> {
  2.      Set<K> keySet(K key, boolean isLeftKey);
  3.      ...
  4. }


message d'erreur :
 


/Net/mahonet/Utilisateurs/ffournel/m1/java/Graph/src/graph/GraphMapUtil.java:788: cannot find symbol
symbol  : method keySet(java.util.Set<T>,boolean)
location: interface graph.DirectedGraphMap<capture of ? extends java.util.Set<T>,V>
        Iterator<? extends Set<T>> pred = g.keySet(node, false).iterator();


 
Help :cry:

Reply

Marsh Posté le 04-01-2005 à 20:04:34   

Reply

Marsh Posté le 04-01-2005 à 23:29:26    

ben c'est clair ...
keySet prend en paramètre un objet de type générique K et toi tu lui balance un Set de ce type ...
tu l'appelles pas avec le bon paramètre quoi ...


Message édité par benou le 04-01-2005 à 23:30:00

---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 05-01-2005 à 18:11:00    

Pourtant je précise que le type K est :


? extends Set<T>


 
dans le prototype de la fonction grapheIdeaux
donc si je lui file un type Set comme K lors de l'appel a keySet, le type K defini dans le prototype est toujours respecté pourtant non :??:
Peux-tu me proposer une reponse pour ce problème ?, comment corriger cette ligne qui merde ?

Reply

Marsh Posté le 05-01-2005 à 18:17:37    

benou a écrit :

ben c'est clair ...


euh, "clair", faut pas exagerer [:icon15]


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 05-01-2005 à 18:20:29    

ouais en fait t'as raison :/
 
tin e que c'est chaint à lire quand c'est plein de générique comme ca :(


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 05-01-2005 à 18:21:25    

the real moins moins a écrit :

euh, "clair", faut pas exagerer [:icon15]


surtout que je me suis chié dessus  :sweat:  
[:neowen]


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 05-01-2005 à 18:47:10    

bon, déjà le pb, c'est que ta fonction retourne un Set<K> que tu essaie d'affecter à un Iterator<U> (U valant "? extends Set<T>", j'ai simplifié). Autant que je sache Iterator n'hérite pas de Set :??:
 
Ça règle pas le problème, mais ça me turlupine ...


Message édité par bobuse le 05-01-2005 à 18:48:53
Reply

Marsh Posté le 05-01-2005 à 18:55:12    

bobuse a écrit :

bon, déjà le pb, c'est que ta fonction retourne un Set<K> que tu essaie d'affecter à un Iterator<U> (U valant "? extends Set<T>", j'ai simplifié). Autant que je sache Iterator n'hérite pas de Set :??:


 
surtout que y a pas de problème : regarde bien : il fait un .iterator() sur la valeur retournée par keySet ...


Message édité par benou le 05-01-2005 à 18:58:24

---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 05-01-2005 à 18:55:33    

Je pars peut-être en fumette, mais j'aurai essayé :D

Reply

Marsh Posté le 05-01-2005 à 18:56:24    

benou a écrit :

surtout que y a pas de problème : regarde bien : il fait un .iterator() sur la valeur retournée par keySet ...


Mince, j'avais pas vu ça :D

Reply

Marsh Posté le 05-01-2005 à 18:56:24   

Reply

Marsh Posté le 05-01-2005 à 19:01:40    

n'empêche que si !
 
edit : non en fait :whistle:


Message édité par bobuse le 05-01-2005 à 19:54:42
Reply

Marsh Posté le 05-01-2005 à 19:26:07    

compris !!!! \o/
 
en fait, là ton g c'est un DirectedGraphMap la clef est d'un type qui étend Set<K>. exemple : DirectedGraphMap<ArrayList<T>,V>.
Donc tu ne peux pas t'en servir comme d'un Set<K> parce que l'objet passé peut être d'un type plus spécifique que Set<K>.
 
exemple : si la ligne  

Set<T> node = topoIt.next();


te retourne une truc du type LinkedList<T>, tu ne pourras pas le passer en argument à keySet qui attend un argument de type ArrayList<T>.
 
 
tin, qu'est ce que c'est tordu [:w3c compliant]


Message édité par benou le 05-01-2005 à 19:33:43

---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 05-01-2005 à 19:37:57    

exercice n°2 : maintenant faut trouver la bonne signature de méthode pour que ca passe [:ddr555]


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 05-01-2005 à 19:40:35    

ouaip, j'en suis arrivé à la même conclusion en copiant le code sous eclipse.
D'ailleurs, j'aimerai bien voir le prototype de topologicSort :)

Reply

Marsh Posté le 05-01-2005 à 19:42:37    

benou a écrit :

exercice n°2 : maintenant faut trouver la bonne signature de méthode pour que ca passe [:ddr555]


Ben en changeant  

grapheIdeaux(DirectedGraphMap<? extends Set<T>,V> g)


en

grapheIdeaux(DirectedGraphMap<Set<T>,V> g)


ça devrait le faire ... à voir en fonction des autres contraintes que je ne peux pas deviner, mais j'imagine que ce ? extends Set<T> n'est pas là par hasard :/

Reply

Marsh Posté le 05-01-2005 à 19:43:50    

je m'y tente [:ddr555]
 

Code :
  1. static<T,V,B extends Set<T>> DirectedGraphMap<Set<T>,Set<T>>
  2.         grapheIdeaux(DirectedGraphMap<B,V> g) {
  3.             //OK  
  4.             ArrayList<B> topoSort;
  5.             //OK  
  6.             topoSort = topologicSort(g);
  7.             //OK  
  8.             Iterator<B> topoIt = topoSort.iterator();
  9.             //OK  
  10.         while(topoIt.hasNext()) {
  11.                 //OK  
  12.             B node = topoIt.next();
  13.                 // je mise 3 navets que ca passe
  14.             Iterator<B> pred = g.keySet(node, false).iterator();
  15.                 ...
  16.             }
  17. }


 
edit : y a peut être moyen de faire que le type de retour soit DirectedGraphMap<B,B>, mais je peux pas savoir sans connaître le reste du corp de la méthode ...


Message édité par benou le 05-01-2005 à 19:48:24

---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 05-01-2005 à 19:45:26    

bobuse a écrit :

Ben en changeant  

grapheIdeaux(DirectedGraphMap<? extends Set<T>,V> g)


en

grapheIdeaux(DirectedGraphMap<Set<T>,V> g)


ça devrait le faire ... à voir en fonction des autres


trop restrictif : tu n'acceptes plus que les Set<T> et pas les ArrayList<T> par exemple :/


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 05-01-2005 à 19:46:23    

bobuse a écrit :

ouaip, j'en suis arrivé à la même conclusion en copiant le code sous eclipse.


moi je le fais quand même sans avoir jamais installé un jdk1.5 : tout dans la tête !!! :D


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 05-01-2005 à 19:53:08    

j'ai plus de navets, ça te va des patates :D
 
chez moi ça passe :)

Reply

Marsh Posté le 05-01-2005 à 19:56:09    

bobuse a écrit :


chez moi ça passe :)


[:youpi] [:youpi] [:youpi] [:youpi]
 
 
va quand même falloir que je me le teste ce Tiger :sweat:  
en tout cas, la doc sur les generics dont t'as filé le lien est top ! :jap:


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 05-01-2005 à 19:58:23    

euh où la doc? [:cupra]


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 05-01-2005 à 19:59:44    

juste une question comme ça en passant : ça existe la spécialisation des templates en Java 1.5 ?


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 05-01-2005 à 20:01:26    

Reply

Marsh Posté le 05-01-2005 à 20:01:47    

:jap:


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 05-01-2005 à 20:01:55    


oups, c'était dans un message que j'ai délété :D
je répondrai bien : http://www.google.fr/search?q=java+generics
mais je vais vous économiser un clic : http://java.sun.com/j2se/1.5/pdf/generics-tutorial.pdf
 
A noter aussi le cours sur développez.com : http://lroux.developpez.com/articl [...] age=page_5

Reply

Marsh Posté le 05-01-2005 à 20:02:10    

harko > non, ça fonctionne par erasure qu'on te dit :o

Reply

Marsh Posté le 05-01-2005 à 20:03:04    

ben oui, mais benou parlait d'un bon doc, donc je demandais lequel [:icon12]


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 05-01-2005 à 20:04:03    

Harkonnen a écrit :

juste une question comme ça en passant : ça existe la spécialisation des templates en Java 1.5 ?


c'est-à-dire :??:

Reply

Marsh Posté le 05-01-2005 à 20:04:17    

Harkonnen a écrit :

juste une question comme ça en passant : ça existe la spécialisation des templates en Java 1.5 ?


squoi la spécialisation de template ?


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 05-01-2005 à 20:06:38    

bobuse a écrit :

c'est-à-dire :??:


un template spécialisé pour certains types :spamafote:
au lieu d'avoir un template pour tous les types, j'aimerais pouvoir dire que mon template n'est valable que pour certains types, pas pour tous


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 05-01-2005 à 20:07:44    

nraynaud a écrit :

harko > non, ça fonctionne par erasure qu'on te dit :o


dommage, mais merci quand même [:benou_jap]


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 05-01-2005 à 20:07:55    

bobuse, benou > mettre un code différent du code générique pour certaines valeurs du paramètre générique :
 
(style optimiser le calcul d'un truc pour les ints par ex.)

Reply

Marsh Posté le 05-01-2005 à 20:08:31    

Harkonnen a écrit :

un template spécialisé pour certains types :spamafote:
au lieu d'avoir un template pour tous les types, j'aimerais pouvoir dire que mon template n'est valable que pour certains types, pas pour tous


Ben un truc du genre alors :

Code :
  1. public <T extends Number> maFonction(T number) {
  2.   //...
  3. }

Reply

Marsh Posté le 05-01-2005 à 20:09:14    

nraynaud a écrit :


(style optimiser le calcul d'un truc pour les ints par ex.)


c'est exactement pour ça que j'aurais voulu que ça existe :jap:


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 05-01-2005 à 20:09:23    

Harkonnen a écrit :

un template spécialisé pour certains types :spamafote:
au lieu d'avoir un template pour tous les types, j'aimerais pouvoir dire que mon template n'est valable que pour certains types, pas pour tous


bha oui :  

Code :
  1. public class TonGeneric<T extends Number> { ...}


et pouf, t'as une classe TonGeneric dont tu ne peux te servir qu'avec des nombres (Integer, BigInteger, Long, etc ...)


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 05-01-2005 à 20:09:28    

nraynaud a écrit :

bobuse, benou > mettre un code différent du code générique pour certaines valeurs du paramètre générique :
 
(style optimiser le calcul d'un truc pour les ints par ex.)


ben suffit d'écrire plusieurs templates alors, non ?
 
Bon sur ce, je me rentre :D


Message édité par bobuse le 05-01-2005 à 20:11:31
Reply

Marsh Posté le 05-01-2005 à 20:11:45    

bobuse a écrit :

ben suffit d'écrire plusieurs fonctions alors, non ?


ouais, ca devrait marcher je pense ...


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 05-01-2005 à 20:14:08    

genre :

Code :
  1. public class TonGeneric<T extends Number> {
  2.    // fonction generaliste
  3.    public void f(T t) { ... };
  4.    // fonction optimisée pour les Integer et ses sous-classes
  5.    public <SI extends T & Integer> void f(SI i) { ... };
  6. }


 
nan ?
 
ca compile ca ? [:gratgrat]


Message édité par benou le 05-01-2005 à 20:34:24

---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le 05-01-2005 à 20:23:35    

idea est pas content en tous cas: "wildcards may only be used as reference parameters"


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 05-01-2005 à 20:24:44    

the real moins moins a écrit :

idea est pas content en tous cas: "wildcards may only be used as reference parameters"


j'ai édité ...


---------------
ma vie, mon oeuvre - HomePlayer
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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