Genéricos
Los tipos genéricos en Java son un mecanismo de programación que permite crear clases y métodos parametrizados. Esto significa que en lugar de especificar un tipo específico de datos, se especifica un parámetro de tipo que puede ser reemplazado por un tipo específico al crear una instancia de la clase o al invocar el método.
Por ejemplo, la clase ArrayList en Java es una clase genérica que permite crear una lista de cualquier tipo de datos. En lugar de tener que crear una clase específica para cada tipo de datos, se puede crear una clase ArrayList
ArrayList<Integer> numbers = new ArrayList<>();
numbers.add(1);
numbers.add(2);
ArrayList<String> words = new ArrayList<>();
words.add("Hola");
words.add("Mundo");
También se pueden utilizar tipos genéricos en métodos, por ejemplo, se puede crear un método genérico que intercambie dos elementos en una lista:
public static <E> void swap(List<E> list, int i, int j) {
E temp = list.get(i);
list.set(i, list.get(j));
list.set(j, temp);
}
En este ejemplo, el método swap() es parametrizado con el tipo genérico E, que puede ser reemplazado por cualquier tipo de datos al invocar el método.
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
List<String> words = Arrays.asList("Hola", "Mundo", "Java", "Genéricos");
swap(numbers, 0, 1);
swap(words, 1, 2);
Los tipos genéricos proporcionan una forma de escribir código más genérico y reusable, ya que se pueden crear clases y métodos que funcionen con cualquier tipo de datos sin tener que crear una clase o un método específico para cada tipo de datos.
Para crear una clase genérica en Java, se especifican los parámetros de tipo entre los corchetes < > después del nombre de la clase. Por ejemplo, para crear una clase genérica que represente un par de valores, se puede utilizar el siguiente código:
class Pair<T, U> {
private T first;
private U second;
public Pair(T first, U second) {
this.first = first;
this.second = second;
}
public T getFirst() {
return first;
}
public U getSecond() {
return second;
}
}
En este ejemplo, la clase Pair está parametrizada con dos tipos genéricos T y U. Estos tipos genéricos pueden ser reemplazados por cualquier tipo de datos al crear una instancia de la clase.
Pair<Integer, String> pair = new Pair<>(1, "Hola");
System.out.println(pair.getFirst()); // Output: 1
System.out.println(pair.getSecond()); // Output: "Hola"
También se pueden especificar restricciones en los tipos genéricos utilizando la keyword "extends", por ejemplo:
class MyClass<T extends Number> {
// class implementation here
}
En este ejemplo, el tipo genérico T solo puede ser reemplazado por tipos que extienden de la clase Number, como Integer, Double, etc.
Es importante notar que los tipos genéricos son una característica de Java desde la versión 5.0, antes de esta versión se podían usar clases como Vector o ArrayList pero no se podía especificar el tipo de dato que almacenaba.