[Résolu][Java] Problème de for each

J’ai un petit soucis que je n’arrive pas à comprendre.
Je pense que ça vient d’une incompréhension de la généricité en Java, mais ce que je fais me semble plutôt logique… mais ne doit pas l’être.

J’ai tout d’abord une classe générique qui s’appelle Transactions et qui implémente Iterable (pour pouvoir utiliser une boucle for-each dessus)

(je met que les méthodes importantes)

[code]public class Transaction implements Iterable{

private ArrayList<E> produits;

public Transaction(){

 produits = new ArrayList();
}
 
      public Iterator iterator(){
           return produits.iterator();
       }
}[/code]

Ensuite dans une autre classe, j’ai une ArrayList de transactions, transactions qui contiennent des String.
Je la déclare comme suit :

Enfin, voilà le bout de code qui me pose problème : je souhaite afficher toutes les transactions ligne par ligne :

public void afficherDonnees(){ &nbsp; &nbsp; &nbsp; &nbsp;for(Transaction<String> transaction : transactions){ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;int noTransaction=1; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;System.out.print("Transaction n°"+noTransaction++ + ": "); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;for(String produit : transaction){ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;System.out.print(produit + " "); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;} &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;System.out.println("\n"); &nbsp; &nbsp; &nbsp; &nbsp;} &nbsp; &nbsp;}

La le compilateur bloque sur la ligne “for(String produit : transaction){” en me disant :

aPriori\Donnees.java:72: incompatible types found &nbsp; : java.lang.Object required: java.lang.String &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;for(String produit : t){ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ^

Bref je pourrais faire plus simple en créant une méthode afficherTransaction()… mais je comprends pas pourquoi ça ne fonctionne pas là.

Je suis pas terrible en Java, mais il me semble que l’interface que tu dois implémenter doit plutot etre Iterable.
de plus, le “int noTransaction=1;” doit etre déclaré avant la boucle et non à l’intérieur… sinon il t’affichera à chaque fois 1.

[quote name=‘Gimly’ date=’ 31 May 2005, 23:13’]J’ai un petit soucis que je n’arrive pas à comprendre.
Je pense que ça vient d’une incompréhension de la généricité en Java, mais ce que je fais me semble plutôt logique… mais ne doit pas l’être.

J’ai tout d’abord une classe générique qui s’appelle Transactions et qui implémente Iterable (pour pouvoir utiliser une boucle for-each dessus)

(je met que les méthodes importantes)

[code]public class Transaction implements Iterable{

private ArrayList<E> produits;

public Transaction(){

produits = new ArrayList();
}

   public Iterator<E> iterator(){
		return produits.iterator();
	}

}[/code]

Ensuite dans une autre classe, j’ai une ArrayList de transactions, transactions qui contiennent des String.
Je la déclare comme suit :

Enfin, voilà le bout de code qui me pose problème : je souhaite afficher toutes les transactions ligne par ligne :

public void afficherDonnees(){ for(Transaction<String> transaction : transactions){ int noTransaction=1; System.out.print("Transaction n°"+noTransaction++ + ": "); for(String produit : transaction){ System.out.print(produit + " "); } System.out.println("\n"); } }

La le compilateur bloque sur la ligne “for(String produit : transaction){” en me disant :

aPriori\Donnees.java:72: incompatible types found : java.lang.Object required: java.lang.String for(String produit : t){ ^

Bref je pourrais faire plus simple en créant une méthode afficherTransaction()… mais je comprends pas pourquoi ça ne fonctionne pas là.
[right][post=“364138”]<{POST_SNAPBACK}>[/post][/right][/quote]

C’est moi ou le Java a bien changé en 3 ans? Pff, je reconnais rien. N’empêche, tu as peut etre besoin d’un cast explicite de transaction en String : for(String produit : (String) t);
M’enfin je me gourre peut-être.

[quote name=‹ girafologue › date=’ 1 Jun 2005, 00:21’]Je suis pas terrible en Java, mais il me semble que l’interface que tu dois implémenter doit plutot etre Iterable.
de plus, le « int noTransaction=1; » doit etre déclaré avant la boucle et non à l’intérieur… sinon il t’affichera à chaque fois 1.
[right][post=« 364141 »]<{POST_SNAPBACK}>[/post][/right][/quote]

Arf merci pour le Iterable. :stuck_out_tongue: J’avais pas compris ça comme ça… mais en effet maintenant ça me semble logique.

Par contre pour la faute de débutant hum… no comment hein :stuck_out_tongue: on mettra ça sur le compte de la fatigue… (t’cheu la honte)

[quote name=‹ kaneloon › date=’ 1 Jun 2005, 00:24’]C’est moi ou le Java a bien changé en 3 ans? Pff, je reconnais rien. N’empêche, tu as peut etre besoin d’un cast explicite de transaction en String : for(String produit : (String) t);
M’enfin je me gourre peut-être.
[right][post=« 364142 »]<{POST_SNAPBACK}>[/post][/right][/quote]

Java a pas mal changé avec la version 1.5 en fait… j’essaye justement de comprendre ses mécanismes.

Pour le cast explicite, c’est pas le cas car c’est justement le but des types génériques, éviter de devoir transtyper et que ce soit le compilateur qui vérifie qu’on ait pas fait une connerie avec le typage.