Java. Genéricos
Descripción
Permiten utilizar tipos concretos en tiempo de compilación con clases que trabajan con tipos arbitrarios. Las clases genéricas tienen tipos parametrizados y el tipo parametrizado se sustituye por un tipo específico. Una vez definido el tipo, la instancia creada solo trabaja con el tipo establecido.Definición de la interface List:
public interface List<E> extends Collection<E>Definición de la clase ArrayList:
public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.SerializableDefinición de la interface Map:
public interface Map<K,V>Definición de la clase HashMap:
public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, SerializableEjemplo con List y Map:
// Declarar una lista sin tipo genérico List lista1 = new ArrayList(); // Al añadir objetos a la lista ella acepta objetos Objetc // Declarar una lista con un tipo específico List<String> lista2 = new ArrayList<>(); // Al añadir objetos a la lista, esta solo acepta String // Map, la clave es un Integer y el objeto asociado es un String Map<Integer, String> map = new HashMap<>();
A las clases genéricas también se les llama clases parametrizadas. Los tipos de una clase genérica se definen entre <>, separados por coma si hay más de uno.
Ejemplo de una clase parametrizada:
public class Generico1<T> { // Propiedad parametrizada private T unObjeto; public Generico1() { } public Generico1(T unObjeto) { this.unObjeto = unObjeto; } public T getUnObjeto() { return unObjeto; } public void setUnObjeto(T unObjeto) { this.unObjeto = unObjeto; } }
Al crear un objeto Generico1 se le indica entre <> el tipo a utilizar.
Ejemplo de instancias Generico1:
Generico1<String> g1 = new Generico1<>("Hola"); Generico1<Integer> g2 = new Generico1<>(1);
También puede restringirse el tipo a utilizar en las clases genéricas:
public class Generico2<T extends Number> { // Propiedades parametrizadas private T objeto1; private T objeto2; public Generico2(T objeto1, T objeto2) { this.objeto1 = objeto1; this.objeto2 = objeto2; } public T getObjeto1() { return objeto1; } public void setObjeto1(T objeto1) { this.objeto1 = objeto1; } public T getObjeto2() { return objeto2; } public void setObjeto2(T objeto2) { this.objeto2 = objeto2; } public double sumar() { return objeto1.doubleValue() + objeto2.doubleValue(); } }
Según la documentación:
The abstract class Number is the superclass of classes BigDecimal, BigInteger, Byte, Double, Float, Integer, Long, and Short.
Instancias de Generico2:
Generico2<Double> g3 = new Generico2<>(12.5d, 12.5d); System.out.println("Sumar: " + g3.sumar());
Pueden definirse métodos genéricos en una clase:
public class GenericoMetodo { /** * Método genérico que intercambia dos posiciones. * @param <MiG> * @param vector * @param i * @param j */ public static <MiG> void metodogenerico(MiG[] vector, int i, int j){ System.out.println("Método genérico: "); MiG tmp = vector[i]; vector[i] = vector[j]; vector[j] = tmp; } }
Para hacer uso del método:
String vector[] = {"Uno", "Dos", "tres"}; System.out.println(Arrays.toString(vector)); GenericoMetodo.metodogenerico(vector, 0, 2); System.out.println(Arrays.toString(vector));
Comentarios
Publicar un comentario