Hola fedegaray, tu código está bien.
En el bucle
while (it.hasNext()) {
System.out.println (it.next());
}
Lo que haces es mostrar los objetos completos por pantalla, en este caso es Java quien se encarga de mostrar el objeto. Pero no estás recorriendo cada uno de los elementos que contienen los objetos. A modo de ejercicio, sería interesante que probaras a recorrer cada uno de los elementos y mostrar cada elemento por separado.
Esto sería un ejemplo
import java.util.HashSet;
import java.util.TreeSet;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.Iterator;
public class TestPolimorfismo
{
public static void main(String[]args){
List<Set>miLista=new ArrayList<Set>();
Set<String>miConjuntoDeStrings=new HashSet<String>();
Set<Integer>miConjuntoDeIntegers=new TreeSet<Integer>();
miConjuntoDeStrings.add("luna");
miConjuntoDeStrings.add("sol");
miConjuntoDeStrings.add("saturno");
miConjuntoDeIntegers.add(2);
miConjuntoDeIntegers.add(8);
miConjuntoDeIntegers.add(5);
miLista.add(miConjuntoDeStrings);
miLista.add(miConjuntoDeIntegers);
Iterator it1 = miLista.iterator();
while (it1.hasNext()) {
Set tmp = (Set)it1.next();
Iterator it2=tmp.iterator();
if(tmp instanceof HashSet) {
System.out.println("Elementos del HashSet.");
} else {
System.out.println("Elementos del TreeSet.");
}
int i = 0;
while(it2.hasNext()){
System.out.println("i: " + (i++) + " - " + it2.next());
}
}
}
}
Otra opción, para evitar tener que hacer el casting Set tmp = (Set)it1.next(); sería declarar el tipo que devuelve el iterator así:
Iterator<Set> it1 = miLista.iterator();
while (it1.hasNext()) {
Set tmp = it1.next();
Iterator it2=tmp.iterator();
int i = 0;
while(it2.hasNext()){
System.out.println("i: " + (i++) + " - " + it2.next());
}
}
Declarándolo así el iterador es sobre Set, mientras que de la otra manera es sobre Object y de ahí que haga falta el casting.