A ver te explico porque necesitas el casting.
Tu cuando creas un ArrayList, le estas diciendo que tipos de elementos va a contener.
Cuando creas el iterador como lo estas haciendo, empiezas a recorrer la lista y obtienes uno de los elementos de la lista a través del iterador, el iterador no sabe que tipo de elementos está sacando de la lista.
Y por esto tienes que realizar casting, porque el iterador de la forma que tu lo estas creando, devuelve un elemento de tipo Object(Clase padre de todas las clases en java)
entonces el casteo es obligatorio para convertir ese elemento de tipo Object en el tipo que a ti te interesa, en este caso Integer.
En cambio, existe el iterador genérico, para crearlo seria del siguiente modo:
Iterator<Tipo_objeto_a_manejar> nombreIterador= nombreLista.iterator();
De esta manera, ya si le estas diciendo con que tipo de objetos va a manejar el iterador.
Te adjunto un ejemplo de cada iterador:
import java.util.ArrayList;
import java.util.Iterator;
public class TestIterador {
public static void main(String[] arg){
ArrayList<Integer> listaNumeros=new ArrayList<>();
Integer aux;
for(int i=0;i<100;i++){
listaNumeros.add(i);
}
/*Iterador normal, con este tenemos que hacer casting,
porque no sabe que tipo de elementos esta sacando de la lista */
Iterator iL1=listaNumeros.iterator();
while(iL1.hasNext()){
aux=(Integer)iL1.next();
System.out.println("Numero con iterador normal: "+aux);
}
/*Iterador genérico, este si sabe los tipos de los elementos q
saca de la lista, por tanto no es necesario hacer casting */
Iterator<Integer> iL2=listaNumeros.iterator();
while(iL2.hasNext()){
aux=iL2.next();
System.out.println("Numero con iterador generico: "+aux);
}
}
}
Un saludo!!