Genéricos
Genéricos
Los mtodos y clases ordinarios funcionan con tipos especficos: con tipos
primitivos o con clases.
Una de las formas en que los lenguajes orientados a objetos permiten la
generalizacin es a travs del polimorfismo.
Los genricos implementan el concepto de tipos parametrizados, que permiten
crear componentes(especialmente
contenedores) que resultan fciles de utilizar con mltiples tipos.
El termino "genrico significa perteneciente o apropiado a grandes grupos de
clases".
La intencin original de los genricos en los lenguajes de programacin era
dotar el programador de la mayor
capacidad expresiva posible a la hora de escribir clases o mtodos, relajando
las restricciones que afectan a los tipos
con los que esas clases o mtodos pueden funcionar.
Existen una serie de convenciones para nombrar a los genricos:
E Element (usado bastante por Java Collections Framework)
K Key (Llave, usado en mapas)
N Number (para nmeros)
T Type (Representa un tipo, es decir, una clase)
V Value (representa el valor, tambin se usa en mapas)
S,U,V etc. usado para representar otros tipos.
Genricos Simples
Java Generics o simplemente clases Genricas.
Vamos a escribir algunos artculos hablando de este tema .Para empezar con
ello vamos a construir la clase Bolsa que es una clase sencilla que nos
permitir almacenar objetos de varios tipos.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
package com.arquitecturajava;
import java.util.ArrayList;
import java.util.Iterator;
public class Bolsa implements Iterable{
private ArrayList lista= new ArrayList();
private int tope;
public Bolsa(int tope) {
super();
this.tope = tope;
}
public void add(Object objeto ) {
if (lista.size()<=tope) {
lista.add(objeto);
}else {
throw new RuntimeException("no caben mas");
}
}
public Iterator iterator() {
return lista.iterator();
}
}
En nuestro caso vamos a disponer de dos clases con las cuales rellenar la bolsa
. La clase Golosina y la clase Chocolatina.
1
2
3
4
package com.arquitecturajava;
public class Chocolatina {
private String marca;
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package com.arquitecturajava;
public class Golosina {
private String nombre;
public String getNombre() {
return nombre;
}
public void setNombre(String nombre) {
this.nombre = nombre;
}
public Golosina(String nombre) {
super();
this.nombre = nombre;
}
}
1
2
3
4
package com.arquitecturajava;
public class Principal {
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
El programa funcionar correctamente, pero nos podremos dar cuenta que resulta bastante poco
amigable la estructura if /else en la cual se chequean cada uno de los tipos a la hora de
presentarlo por pantalla.
Para solventar este problema podemos construir una clase Genrica .Este tipo de clase nos
permitir definir una Bolsa de un tipo concreto . Puede ser una bolsa de Golosinas o una bolsa de
Chocolatinas pero NO de las dos cosas a la vez .Esto en un principio puede parecer poco
flexible pero si nos ponemos a pensar cuando programamos solemos imprimir una lista de Facturas
o una lista de Compras no una lista mixta. As pues el enfoque parece razonable. Vamos a ver el
cdigo fuente y comentarlo:
package com.arquitecturajava.genericos;
1
2
3
4
import java.util.ArrayList;
import java.util.Iterator;
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
La clase es un poco peculiar ya que al no saber de entrada de que tipo va a ser la bolsa debemos
declarar un tipo Genrico T a nivel de clase y que ser repetido en cada uno de los mtodos
que lo usen.
De esta manera cuando construyamos un objeto de esta clase ser el momento de especificar el
tipo de Bolsa que deseamos .En el siguiente ejemplo hemos elegido Chocolatina como tipo para
la Bolsa . De esta manera la bolsa solo admitir este tipo de objetos.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package com.arquitecturajava.genericos;
import com.arquitecturajava.Chocolatina;
import com.arquitecturajava.Golosina;
public class Principal {
public static void main(String[] args) {
Bolsa<Chocolatina> bolsa= new Bolsa<Chocolatina>();
Chocolatina c= new Chocolatina("milka");
Chocolatina c1= new Chocolatina("milka");
Chocolatina c2= new Chocolatina("ferrero");
bolsa.add(c);
bolsa.add(c1);
bolsa.add(c2);
for (Chocolatina chocolatina:bolsa) {
System.out.println(chocolatina.getMarca());
}
}
}
Acabamos de construir nuestra primera clase Generica y hemos usado un bucle forEach para
recorrerla de una forma sencilla.
Tuplas:
Es un grupo de objetos que se envuelven juntos dentro de otro objeto nico.
El receptor del objeto estar autorizado a leer los elementos, pero no a
introducir otros nuevos( este
Concepto tambin se conoce como Objeto de transferencia de datos o
Mensajero).
Tuplas puede tener, normalmente, cualquier longitud, y cada objeto de la tupla
puede tener un tipo distinto.
Para tratar con el problema de las mltiples longitudes, podemos crear
mltiples tuplas diferentes.
He aqu una que almacena dos objetos.
//: net/mindview/til/Twotuple.java
Public class TwoTuple<A,B> {
Public final A first;
Public final B second;
Public TwoTuple (A a, B b) ( first = a; second = b;)
Public String ToString () {
Return {+ first + ,+ second +};
}
}///:Pilas - Stack:
La clase Stack que implementaba la pila se construyo componiendo una clase
genrica(Stack<T>) con otra clase genrica(LinkedList<T>).
En dicho ejemplo, observar que ( con unas cuantas excepciones que
posteriormente realizaremos) un tipo genrico no es otra cosa que un tipo
normal.
//: generics/LinkedStack.java
//Una pila implementada con una estructura enlazada interna.
public class LinkStack<T> {
pirvate static class Node<U> (
U item;
Node <U> next;
Noode ( U item, item, Node <U> next) {
this.item = item;
this.next = next;
}
RamdonLisT:
Ahora para expandir las funcionalidades de la clase desarrollamos un mtodo
que recibe y procesa u item de un tipo generico:
public class miClase<T> {
private ArrayList<T> lista;
public miClase() {
lista = new ArrayList<T>();
}
public void add(T element) {
lista.add(element);
Interfaces Genricas:
Las interfaces genricas se declaran de la "misma manera" que una clase genrica,
veamos la sintaxis general:
interface nombre-interfaz<T1, T2, T3...>{
metodo1();
metodo2();
}
Donde T1, T2, T3... son los tipos parametrizados.
Aunque no siempre se as, una clase que implementa esta interfaz debe ser en forma
general:
Si crea una clase genrica en Java (la clase de los parmetros de tipo
genrico), puede utilizar los mtodos genricos (el mtodo tiene parmetros de
tipo genrico)?
Mtodos Genricos:
Esta clase proporciona una implementacin bsica que producir objetos de una clase
que(1) sea pblica (ya que BasicGenerator esta en un paquete separado. La clase en
cuestin debe tener acceso pblico y no simplemente de paquete) y (2) tenga un
constructor predeterminado ( uno que no tome ningn argumento).