Clases y tipos genéricos
Mejor con un ejemplo:
class ClaseGenerica<T> {
T obj;
public ClaseGenerica(T o) {
obj = o;
}
public void classType() {
System.out.println("El tipo de T es " + obj.getClass().getName());
}
}
public class MainClass {
public static void main(String args[]) {
// Creamos una instancia de ClaseGenerica para Integer.
ClaseGenerica<Integer> intObj = new ClaseGenerica<Integer>(88);
intObj.classType();
// Creamos una instancia de ClaseGenerica para String.
ClaseGenerica<String> strObj = new ClaseGenerica<String>("Test");
strObj.classType();
}
}
Unos apuntes:
- T es el tipo genérico que será reemplazado por un tipo real.
- T es el nombre que damos al parámetro genérico.
- Este nombre se sustituirá por el tipo real que se le pasará a la clase.
El resultado será el siguiente:
El tipo de T es java.lang.Integer
El tipo de T es java.lang.String
Hay que tener en cuenta que los generics de java solo funcionan con objetos. El código siguiente nos mostrará un error:
ClaseGenerica<int> myOb = new ClaseGenerica<int>(53); // Error, can't use primitive type
Existen una serie de convenciones para nombrar a los genéricos:
E – Element (usado bastante por Java Collections Framework)
K – Key (Llave, usado en mapas)
N – Number (para números)
T – Type (Representa un tipo, es decir, una clase)
V – Value (representa el valor, también se usa en mapas)
S,U,V etc. – usado para representar otros tipos.
El artículo original se puede encontrar en este post: http://jonsegador.com/2012/10/clases-y-tipos-genericos-en-java
NOTA: artículo publicado por jonseg
Reader Comments (2)
A propósito de genéricos, hay dos enlaces que me parecen de lo más interesantes:
1.- Cuestiones sobre genéricos.
http://thoughtflow.ca/en/are-you-a-generics-rock-star-or-just-generic-test/
2.- La "biblia" de los genéricos.
http://www.angelikalanger.com/GenericsFAQ/FAQSections/TechnicalDetails.html#Topic9
Este último es realmente denso, pero creo que hay pocos artículos más completos.
Desde mi punto de vista, el conocer genéricos facilita mucho la reducción de clases. Por ejemplo, es habitual ver como con Spring e Hibernate se implementa una clase DAO genérica, que acepta la clave primaria y la clase, y con esta clase, y sin más clases, ya tenemos TODO el modelo de una aplicación (ya sean 10 o 100 clases).
Super cómodo y super mantenible, en mi opinión.