miércoles, 16 de enero de 2013

Genéricos

Buenas amigos, en este nuevo tema vamos a ver los Genéricos. Como ya vimos en las colecciones, estas gestionan los objetos como tipo Object teniendo que manejar conversiones explícitas al tipo específico para poder manejarlas. Esto nos podía resultar engorroso ya que teníamos que estar atento al tipo de conversión.


Otra de las ventajas que nos ofrecen los genéricos es que nos hacen el código más seguro ya que, anteriormente, si nosotros teníamos esto:

Este trozo de código nos compila perfectamente, es al ejecutar cuando nos salta la excepción "ClassCastException" indicando que 14 no puede ser convertida a tipo String. Esto nos puede resultar molesto, ya que no te das cuenta que falla hasta que no ejecutas. Con los genéricos solucionamos este problema, ya que, nos proporcionan un mecanismo que nos permite notificar al compilador que tipo de objeto es el que se va a almacenar.

Esto nos proporciona una serie de ventajas:
    • Si introducimos en la colección genérica un tipo de elemento de un tipo no especificado nos dará un error de compilación. De este modo no tendremos que ejecutar para comprobar si falla, ya que el compilador nos avisará de que no compilará.
    • Ya no será necesario hacer conversiones de tipo ala hora de manejar los elementos, ya que ha sido especificado el tipo de elemento que contendrá y si nos hará la conversión implícitamente  *Tras la versión 1.7 de java, tampoco hay que hacer conversiones te tipo, pero no ta mal que lo sepáis.
Una colección genérica se construye de la siguiente manera:
    • tipo_colección <tipo_objeto> nomVariable.=new tipo_colección<tipo_objeto>();
pongamos un ejemplo. Vamos a crear un ArrayList que solo almacene números enteros:
    • ArrayList <Integer>al=new ArrayList <Integer>();
    • Esta colección solo podrá almacenar datos de tipo Integer, si no es así no nos dejará compilar.
Es importante saber que el tipo_objeto especificado en la colección tiene que ser de tipo objeto, no siendo posible utilizar tipos básicos.

En el caso de las colecciones de la interfaz Map, deberemos usar 2 genéricos, uno para la clave y otro para los elementos. Probemos con un Hashtable.
    • Hashtable <Integer,String> ht=new Hashtable<Integer,String>();
    • Hecho esto, si agregamos una clave distinta a un entero o un elemento distinto a una cadena de caracteres nos dará un error de compilación.
Cuando visitéis la API de java, veréis clases, métodos, etc con un genérico:
      • <E>
Este genérico se denomina tipo parametizado, donde E es la letra utilizada para referirse al tipo de elemento que se pueden añadir y representa cualquier objeto de java. Es decir, cuando encontréis cualquier clase, método, etc con este tipo de genérico en la API, tenéis que saber que puede almacenar o gestionar cualquier objeto que nosotros le pasemos.

Una última cosa que nos queda por agregar son los comodines. Estos se emplean en la declaración de las colecciones genéricas para hacer referencia a cualquier tipo_objeto. Por ejemplo:
    • ArrayList<?> al;
Hemos declarado un ArrayList, pero no sabemos que tipo de elemento va a almacenar. Posteriormente y cuando finalmente creemos la colección, deberemos indicarle que tipo de elemento va a almacenar.
    • al=new ArrayList<String>();
Una vez que lo creamos le indicamos que tipo de elemento va a almacenar. OJO!!! Si en vez de indicarle el tipo_objeto que va a almacenar, cuando lo creamos, y volvemos a poner el comodín '?' nos dará un error de compilación. Una vez que se crea la colección hay que indicarle SIEMPRE el tipo_objeto a almacenar.

También es posible que veáis genéricos como:
    • <? extend Integer>
    • Esto hace que se acepte cualquier objeto Integer o subtipo de este. Pongo Integer, pero podría poner cualquier otro objeto, solo es un ejemplo.
    • <? super Integer>
    • Esto hace que se acepten los tipos integer o supertipos de este.
Nada más voy a agregar, podéis completar lo visto aquí en otros manuales o página web. Para entender los genéricos no hace falta mucho más. 

Un saludo.

No hay comentarios:

Publicar un comentario