IterableClass.java
import java.util.Iterator;
import java.util.LinkedList;
public class IterableClass
	implements Iterable
{
	public IterableClass()
	{
		lt= new LinkedList<Integer>() ;
		lt.add(1) ;
		lt.add(2) ;
		lt.add(3) ;
	}
	public Iterator<Integer> iterator()
	{
		return lt.iterator() ;
	}
	private LinkedList<Integer> lt ;
}
Main.java
import java.util.Iterator;
public class Main
{
	/**
	 * @param args
	 */
	public static void main( String[] args )
	{
		IterableClass ic= new IterableClass() ;
		
		// V1 : compile et fonctionne :)
		System.out.println("V1 :") ;
		for ( Iterator iter= ic.iterator() ; iter.hasNext() ; ) {
			Integer e= (Integer)iter.next() ;
			System.out.println(e.toString()) ;
		}
		// V2 : compile et fonctionne :)
		System.out.println("V2 :") ;
		for ( Iterator<Integer> iter= ic.iterator() ; iter.hasNext() ; ) {
			Integer e= iter.next() ;
			System.out.println(e.toString()) ;
		}
		// V3 : ne compile même pas ! #rage#
		System.out.println("V3 :") ;
		for ( Integer i : ic )
			System.out.println(i.toString()) ;
	}
}
[IMG]http://img480.imageshack.us/img480/9886/pbiterator9ny.png[/IMG]
le problème se situe dans la version 3, elle refuse de compiler, alors qu'il me semble pourtant que c'est théoriquement équivalent à l'écriture de la version 2.... si vous avez une idée, je suis preneur...
  
 
)
).
)
)
 Donc il est considéré comme un sous-type de Iterator ? Donc il n'y a aucune garantie qu'un Iterator<Integer> contiendra réellement des entiers, et donc on ne sait même pas si lire un élément du tableau risque de provoquer une exception ou non ? 
 (i.e. on n'a pas de sûreté du typage, alors qu'on ne fait aucun cast explicite...)
)
 (bon en fait heureusement tout se passe bien parce qu'aucun ClasseGénérique<U> ne peut être un sur-type strict de ClasseGénérique<String>, sauf si U est un wildcard