Colecciones parametrizadas

Las colecciones históricas y las desarrolladas en Java 2 guardan, internamente, los elementos en arrays de tipo Object. Con esto se consigue la máxima generalización ya que Object es la clase base de cualquier objeto Java. 

Esto permite que una colección guarde objetos de cualquier tipo, por ejemplo una lista puede contener cadenas (String), números racionales . . . : 

Ejemplo

       LinkedList lis = new LinkedList();
       Racional r = new Racional(3,7);
       lis.add(r);
       lis.add(newString(«Mi globo»));

Al recuperar elementos de la lista es necesario discernir el tipo concreto de elemento, por ejemplo:

       Object q;
       Racional t;
       q = lis.getFirst();
       if(q instanceof Racional)
              t = (Racional) q;
              . . .

En muchas aplicaciones de colecciones los elementos son del mismo tipo, un conjunto de enteros, una lista de palabras . . . a pesar de lo cual la recuperación de elementos siempre necesita una conversión de Object a ese tipo. Por esta razón, y otras como que el compilador pueda realizar comprobaciones de tipo, a partir de Java 5 se amplia la declaración de todas las clases e interfaces relacionadas con colecciones para dotarlas de la posibilidad de parametrizar el tipo que va a tener los elementos de una colección. Por ejemplo, un vector que vaya a guardar elementos de tipo Complex se declarará e instanciará:

       Vector<Complex> zz;
       zz = new Vector<Complex>(19);

La funcionalidad de Vector no cambia, aunque el compilador si comprobará tipos de datos al realizar operaciones, como por ejemplo añadir elementos:

       Complex nz = new Complex(1,-1);
       zz.addElement(new Integer(8));                // error de compilación, tipo mismatch
       zz.addElement(nz);                                            // correcto

La recuperación de elementos ya no necesita conversión de Object a Complex:

       nz = zz.elementAt(0);

Declaración de un tipo parametrizado

Al nombre de la colección le sigue el tipo de los elementos entre paréntesis angulares (<tipo>):

       Coleccion<tipo> v;

Si se parametrizan dos tipos, como ocurre con los mapas, se separan con coma:

       Coleccion<tipoClave, tipoValor> cc;

Ejemplo

       Stack<Double> pila;

Realmente con el tipo parametrizado es como si se hubiera declarado otra clase, en consecuencia las instancias de colecciones parametrizadas se crean con esa clase, es decir new Coleccion<tipo> crea la instancia.

Ejemplo

       pila = new Stack<Double>();

Sintaxis

A continuación del nombre de la clase se especifican los tipos parametrizados entre paréntesis angulares:

       Coleccion<tipo1 . . . > var;

Para crear instancias new Coleccion<tipo1 . . . >();