                                             // usaremos una misma función para imprimir tanto un ArrayList como un ArrayDeque, pero entonces tenemos que usar un tipo base de ambos (interfaz en este caso)
void imprime(AbstractCollection<?> v) {      // equivalente a  <T> void imprime(AbstractCollection<T> v) {  pero sin tener que introducir T 
   for (var actual : v) {                    // AbstractList permite .get(i) pero ArrayDeque no lo tiene; al menos AbstractCollection admite ambos, ya que ambos tienen iteradores y el for de rango 
      System.out.print(actual); 
      System.out.print(" "); 
   } 
   System.out.println( ); 
} 
 
void main( ) { 
   var a = new ArrayList<Integer>( );        // Integer, porque int no es un class
   a.add(3);         // add es como push_back 
   a.add(1); 
   a.add(4); 
   a.add(1); 
   a.add(6); 
   imprime(a); 
 
   var d = new ArrayDeque<Integer>( );    // desafortunadamente no es totalmente equivalente a std::deque porque no ofrece .get(i) para acceder a los elementos mediante índices 
   d.add(4);                              // no hay una buena razón por la que ArrayDeque no ofrezca .get(i); simplemente no quisieron (y por eso AbstractList no se puede usar con ArrayDeque) 
   d.add(1); 
   d.add(6); 
   d.addFirst(1);    // addFirst es como push_front 
   d.addFirst(3); 
   imprime(d); 
} 
