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