Genéricos en Java

De ChuWiki
Saltar a: navegación, buscar

Copiado de La web del Programador

Una idea aproximada de las clases y métodos genéricos es pensar que reciben, además de los parámetros normales, "parámetros de tipo".

Por poner el típico ejemplo:

Imagina que quieres una lista que guarde sólo objetos de tipo Usuario, para garantizar que no se mezclan con otros objetos. Podrías hacer algo como:

class ListaDeUsuarios {
   public void anadir(Usuario usuario) {
      // guardar un Usuario
   }
   public Usuario leer(int i) {
      //devolver el usuario i
   }
}

Imagina ahora que quieres otra lista que sólo pueda guardar objetos de tipo Cuenta. Harías...

class ListaDeCuentas {
   public void anadir(Cuenta cuenta) {
      // guardar una Cuenta
   }
   public Cuenta leer(int i) {
      // devolver el usuario i
   }
}

Y ahora otra que pueda guardar sólo... etc, etc. Al cabo del rato resulta que tienes un montón de listas muy parecidas, que en lo único que se diferencian es en el tipo de objetos que manejan. Es decir, un montón de código casi repetido.

Pero tú no quieres una única lista en la que pueda haber cualquier cosa. Tú quieres que en una lista determinada sólo pueda haber objetos de un tipo. Si pudieras pasarle al constructor de la clase ese tipo como parámetro... que le pudieras decir "new ListaDe(Usuario)" y "new ListaDe(Cuenta)"... eso estaría bien, no?

Pues exactamente eso es lo que ofrecen los generics. Puedes hacer algo como:

class ListaDe<Tipo> {
   public void anadir(<Tipo> elemento) {
      //guardar un elemento
   }
   public <Tipo> leer(int i) {
      //devolver el usuario i
   }
}

Ahora podrías decir "new ListaDe<Usuario>()" y en esa lista sólo puedes hacer anadir(usuario), o "new ListaDe<Cuenta>()" y en esa sólo puedes añadir objetos de tipo Cuenta.

Esto es sólo el principio y de forma muy breve. Los generics permiten hacer cosas más elaboradas.